0
1

More than 1 year has passed since last update.

# 【Go】画面は作らずにToDo管理システムを作る(第1章)

Posted at

最近になって仕事、プライベートに余裕が出てきたので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の方がわかりやすいですよね。このツールに関しては詳しく説明できませんが、有名なツールなので初学者の方はぜひ一緒に使いましょう。

https://www.postman.com/

今回は以下のリクエストを投げます。

http://localhost:8080/insert?content=朝活(ラジオ体操)
http://localhost:8080/insert?content=仕事
http://localhost:8080/insert?content=部屋掃除
http://localhost:8080/insert?content=自己学習(Go)

Untitled (1).png

実行結果

以下のようにレコードが生成できていれば成功です。

Untitled (2).png

確認用に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

どの企業でも変わった文化ってあるんですね。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1