前提
Go言語の標準ライブラリを使って簡単な勤怠管理システムを作っています。
出退勤のデータを更新(編集)する実装で、受け取ったデータがDBに保存されません。
- 開発環境
Windows10、Go 1.18.3、PostgreSQL14
実現したいこと
ここに実現したいことを箇条書きで書いてください。
- 更新機能を動作するようにする
発生している問題・エラーメッセージ
エラーは出ていないが、更新はされていない
- 実行前
- 実行後
該当のソースコード
Go
1//main.go 2//create(WorkItemCreate)は問題なくできます 3 4package main 5 6import ( 7 "database/sql" 8 "log" 9 "net/http" 10 11 //"strconv" 12 _ "github.com/lib/pq" 13 "text/template" 14 "time" 15) 16 17type WorkItem struct { 18 Id int // ユーザーID 19 WorkdateTime time.Time 20 TimeType string // 出勤時間 or 退勤時間 21} 22 23func main() { 24 http.HandleFunc("/", Index) 25 http.HandleFunc("/create", WorkItemCreate) 26 http.HandleFunc("/edit", WorkItemEdit) 27 http.HandleFunc("/update", WorkItemUpdate) 28 http.ListenAndServe("localhost:8080", nil) 29} 30 31func dbConn() (db *sql.DB) { 32 psqlInfo := "host=localhost user=ams1 password=ams1 dbname=ams1 port=5432 sslmode=disable" 33 db, err := sql.Open("postgres", psqlInfo) 34 if err != nil { 35 panic(err.Error()) 36 } 37 return db 38} 39 40type IndexData struct { 41 Day int // 時間 42 Timetype string // 出勤 or 退勤 43} 44 45func Index(w http.ResponseWriter, r *http.Request) { 46 tmpl, err := template.ParseFiles("templates/index.html") 47 if err != nil { 48 log.Fatal(err) 49 } 50 db := dbConn() 51 52 rows, err := db.Query("SELECT * from workitems WHERE Workdatetime between '2022-07-01' and '2022-07-31' ORDER BY Workdatetime ASC;") 53 if err != nil { 54 log.Fatal(err) 55 } 56 defer rows.Close() 57 58 MapRecords := make(map[IndexData]WorkItem) 59 60 for rows.Next() { 61 var record WorkItem 62 err = rows.Scan(&record.Id, &record.WorkdateTime, &record.TimeType) 63 index := IndexData{record.WorkdateTime.Day(), record.TimeType} 64 if err != nil { 65 log.Fatal(err) 66 } 67 MapRecords[index] = record 68 } 69 70 if err := rows.Err(); err != nil { 71 log.Fatal(err) 72 } 73 74 tmpl.Execute(w, MapRecords) 75 76} 77 78func WorkItemCreate(w http.ResponseWriter, r *http.Request) { 79 db := dbConn() 80 81 if r.Method == "POST" { 82 workdatetime := r.FormValue("workdatetime") 83 timetype := r.FormValue("timetype") 84 85 insert, err := db.Prepare("INSERT INTO workitems(workdatetime, timetype) VALUES($1,$2);") 86 if err != nil { 87 log.Fatal(err) 88 } 89 insert.Exec(workdatetime, timetype) 90 } 91 92 http.Redirect(w, r, "/", 301) 93} 94 95func WorkItemEdit(w http.ResponseWriter, r *http.Request) { 96 db := dbConn() 97 98 uId := r.URL.Query().Get("id") 99 rows, err := db.Query("SELECT * from workitems WHERE id=$1;", uId) 100 if err != nil { 101 log.Fatal(err) 102 } 103 defer rows.Close() 104 105 EditRecord := WorkItem{} 106 for rows.Next() { 107 var item WorkItem 108 err = rows.Scan(&item.Id, &item.WorkdateTime, &item.TimeType) 109 if err != nil { 110 log.Fatal(err) 111 } 112 EditRecord = item 113 } 114 115 tmpl, err := template.ParseFiles("templates/edit.html") 116 if err != nil { 117 log.Fatal(err) 118 } 119 tmpl.Execute(w, EditRecord) 120} 121 122// 今回問題としているコード 123func WorkItemUpdate(w http.ResponseWriter, r *http.Request) { 124 _, err := template.ParseFiles("templates/edit.html") 125 if err != nil { 126 log.Fatal(err) 127 } 128 db := dbConn() 129 130 if r.Method == "POST" { 131 workdatetime := r.FormValue("workdatetime") 132 timetype := r.FormValue("timetype") 133 134 udt, err := db.Prepare("UPDATE workitems SET workdatetime=$1,timetype=$2 WHERE id=$3;") 135 if err != nil { 136 log.Fatal(err) 137 } 138 udt.Exec(workdatetime, timetype) 139 } 140 http.Redirect(w, r, "/", 301) 141} 142
html
1//index.html 2 3 <!DOCTYPE html> 4 <html lang="en"> 5 <head> 6 <meta charset="utf-8"> 7 <title>勤怠管理システム</title> 8 <link rel="stylesheet" href="/static/css/index.css"> 9 </head> 10 <body> 11 <div class="header"> 12 </div> 13 <div> 14 <form action="/create" method="POST"> 15 <input type="datetime-local" name="workdatetime" value="2022-07-01T09:00"> 16 <input type="radio" name="timetype" value="attendance">出勤 17 <input type="radio" name="timetype" value="leave">退勤 18 <input type="submit" value="送信"> 19 </form> 20 </div> 21 <div> 22 {{ range .}} 23 <ul> 24 <li>{{ .WorkdateTime }}</li><a href="/edit?id={{ .Id }}">Edit</a> 25 </ul> 26 {{ end }} 27 </div> 28 </body> 29 </html>
html
1//edit.html 2 3<!DOCTYPE html> 4<html lang="en"> 5 <head> 6 <meta charset="utf-8"> 7 <title>勤怠管理システム</title> 8 <link rel="stylesheet" href="/static/css/index.css"> 9 </head> 10 <body> 11 <div class="header"> 12 </div> 13 <div> 14 <ul> 15 <li>{{ .WorkdateTime }}</li></a> 16 </ul> 17 </div> 18 <div> 19 <h2>勤怠の修正</h2> 20 <form action="/update?id={{.Id}}" method="POST"> 21 <input type="datetime-local" name="workdatetime" value="2022-07-01T09:00"> 22 <input type="radio" name="timetype" value="attendance">出勤 23 <input type="radio" name="timetype" value="leave">退勤 24 <input type="submit" value="変更する"> 25 </form> 26 </div> 27 </body> 28</html> 29 30
試したこと
- デバッグ
WorkItemCreate関数とWorkItemUpdate関数とで同様の結果がでました。
- <form action="/update?id={{.Id}}" method="POST"> の{{ }}部分を変更
{{ .workitem.Id }}などにするとブラウザ上にform文ごと表示されなくなりました。
- その他
WorkItemUpdate関数内のworkdatetimeなどの頭文字を大文字にするなど
補足情報
関数内にformで入力したデータは渡せています。
そのため、main.goでの記述は問題ないんじゃないかと思っています。
以上、どなたか助言をいただけると嬉しいです。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー