最近になって仕事、プライベートに余裕が出てきたのでGoに再入門しました。簡単なコードを書こうと思い、DB操作が絡むToDo管理システム(もどき)を作ることにしました。ですが画面を作るのが憂鬱だったので、HTTPリクエストでイベントを起こしてDB操作する仕組みにします。(画面を作るスキルがないのでこの道しかありませんでした。)
先日投稿した記事も本記事に関連しているので、良ければご覧ください。
技術スタック
**バックエンド:**Go
**DB:**SQLite
**ツール:**Postman、TablePlus、VSCode
データベース構造
カラム名 | id | content | finish | updated | created |
---|---|---|---|---|---|
PK | |||||
カラム概要 | ID | ToDoの内容 | 完了フラグ 0:未完了,1:完了 | 更新日時 | 作成日時 |
型 | 数値 | 文字列 | 数値 | 文字列 | 文字列 |
create table list(id integer primary key, content text, finish integer, updated text, created text);
SQLiteでは数値型かつプライマリーキーを指定すると自動採番()自動で付加されるようです。
id integer primary key
ブーリアンを指定できないのも少し不便ですね。
作ったコード
package main
import (
"database/sql"
"fmt"
"log"
"net/http"
"strconv"
"strings"
"time"
_ "github.com/mattn/go-sqlite3"
)
const (
FORMAT = "2006/01/02 15:04:05"
)
func main() {
handler := func(w http.ResponseWriter, req *http.Request) {
putList(req.FormValue("content"))
}
http.HandleFunc("/insert", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
//受け取るGETパラメータに応じてSQLを生成してINSERTする関数
func putList(parameter string) {
db, err := sql.Open("sqlite3", "./todolist.sqlite3")
checkErr(err)
defer db.Close()
//INSERT文のVALUESに入れる文字列を変数(valuesStr)に格納
nowTime := time.Now()
values := []string{addSingleQuotes(parameter), "0", addSingleQuotes(nowTime.Format(FORMAT)), addSingleQuotes(nowTime.Format(FORMAT))}
valuesStr := strings.Join(values, ",")
//SQLを作成するためスライスを作成して要素を結合
sql := []string{"INSERT INTO list(content, finish ,updated ,created) values(", valuesStr, ")"}
stmt, err := db.Prepare(strings.Join(sql, ""))
checkErr(err)
defer stmt.Close()
stmt.Exec()
rows, err := db.Query("SELECT * FROM list")
checkErr(err)
for rows.Next() {
var id int
var content string
var finish int
var updated string
var created string
err = rows.Scan(&id, &content, &finish, &updated, &created)
checkErr(err)
row := []string{strconv.Itoa(id), content, strconv.Itoa(finish), updated, created}
//取得レコードをカンマ区切りで出力
fmt.Println(strings.Join(row, ","))
}
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}
func addSingleQuotes(ret string) string {
str := []string{"'", ret, "'"}
return strings.Join(str, "")
}
簡単に概要を説明
ローカルにWebサーバを立てて、URLパターンに一致した場合、GETパラメータを取得してINSERT文を動的に生成してToDoリストを作成します。また今回はVSCodeで実行してローカル上で動かしています。遠い過去の学習時に生成したバイナリファイルをHerokuに配置するあたりに苦戦した記憶があります。なお当時のメモは残してません、、、今後また苦戦しそうです、、、やっぱり記録を残すことは大事ですね。
リクエストを投げる準備
リクエストを投げるためPostmanというツールを使います。curlで投げても一緒だと思いますが、初学者出来にはGUIの方がわかりやすいですよね。このツールに関しては詳しく説明できませんが、有名なツールなので初学者の方はぜひ一緒に使いましょう。
今回は以下のリクエストを投げます。
http://localhost:8080/insert?content=朝活(ラジオ体操)
http://localhost:8080/insert?content=仕事
http://localhost:8080/insert?content=部屋掃除
http://localhost:8080/insert?content=自己学習(Go)
実行結果
以下のようにレコードが生成できていれば成功です。
確認用にSELECT文の結果を標準出力しているのでVSCodeでも確認できます。※少し微妙ですが
1,朝活(ラジオ体操),0,2022/02/07 20:06:47,2022/02/07 20:06:47
1,朝活(ラジオ体操),0,2022/02/07 20:06:47,2022/02/07 20:06:47
2,仕事,0,2022/02/07 20:07:05,2022/02/07 20:07:05
1,朝活(ラジオ体操),0,2022/02/07 20:06:47,2022/02/07 20:06:47
2,仕事,0,2022/02/07 20:07:05,2022/02/07 20:07:05
3,部屋掃除,0,2022/02/07 20:07:21,2022/02/07 20:07:21
1,朝活(ラジオ体操),0,2022/02/07 20:06:47,2022/02/07 20:06:47
2,仕事,0,2022/02/07 20:07:05,2022/02/07 20:07:05
3,部屋掃除,0,2022/02/07 20:07:21,2022/02/07 20:07:21
4,自己学習(Go),0,2022/02/07 20:07:35,2022/02/07 20:07:35
今回は第1章なので、これからToDoリストの完了を記録するなど、機能を追加していこうと思います。まず土台はできたと思うので投稿してみました。
最後に
1月から転職して新しい職場で働いているのですが、始業5分前にスピーカーから音楽が流れ、ラジオ体操をする文化があります。最初は戸惑いましたがもう慣れましたw
どの企業でも変わった文化ってあるんですね。