Goで簡易アプリケーションをステップバイステップで作成する
マッチングECサイトを想定した売買アプリケーションを作成する
- Merchantが登録、ログインができる
- Merchantが登録できる項目は以下
- 性
- 名
- 電話番号
- ログインはEmail/Passwordによって行う
- Merchantは商品登録ができる
- 登録可能な項目は以下とする
- 商品名(100文字以内)
- 商品写真(1枚のみ)
- 商品説明
- 登録可能な項目は以下とする
- 買い手をUserとし、登録、ログインができる
- Userの項目はMerchantと同じでよい(後々それぞれ別属性を追加する予定)
- 性
- 名
- 名前
最初のステップはここまでとし、 取引ステップはまた追記する
スプレッドシートにて てきとうなサンプルデータに各テーブル(Merchant, Product, User)に6件ほど登録する
main.goを実行する HelloWorldを出力する
httpをHandleするメソッドはhandler.goファイルを作成して呼び出す
Webサーバをport 8000でたて、 http://localhost:8000で開いてHelloWorldをブラウザ画面から出力する
出力形式をJSONにして、postmanからリクエストを行い、 JSON形式(key-value)でレスポンスを返す
encoding/json パッケージを使ってJSONデータをエンコードする
{
"hello": "world"
}
Merchant, Product, UserのStructを作成する 各Structを初期化させ、スレッドシートにいれたデータでフィールドを満たす
https://qiita.com/cotrpepe/items/b8e7f70f27813a846431
postmanからPOSTリクエスト経由で、MerchantのStructを動的に作成する
- requestBody
{
"name": "hoge",
"email": "hoge@example.com"
}
- response
{
"merchant": {
"ID": 1,
"Email": "hoge@example.com",
"Name": "hoge",
"PhotoURL": ""
},
"success": true
}
sqlite3を利用してデータの永続化を行う
sqliteはmysqlなどのDBと違ってインストールする必要がなく、 ローカルにファイル形式で保存されるデータベースなので使い勝手がよい
Goでsqliteのデータベースにつないでデータベース操作するには github.com/mattn/go-sqlite3のクライアントライブラリを利用する
DBスキーマを作成する step0で作成した定義に基づいて作成する
ノリとしては以下
var schema = `
CREATE TABLE IF NOT EXISTS merchants
(
id INTEGER PRIMARY KEY,
name TEXT,
email TEXT,
photo_url TEXT,
timestamp DATETIME
)`
func prepareSchema(db *sqlx.DB) error {
_, err := db.Exec(schema)
if err != nil {
return fmt.Errorf("could not create http_requests table: %w", err)
}
return nil
}
では、どこで実行するか? 通常はコマンドJobでスキーマ作成を行うが、その解説をしていると本筋からそれるので 今回はWebサーバのエンドポイント経由で作成してみることにする
/dbinit
というエンドポイントからスキーマを作成してみよう
作成したスキーマ(テーブル)にデータを挿入する
merchant := Merchant{
Email: "hayashiki@gmail.com",
Name: "aioue",
PhotoURL: "https://hoge.com",
}
ctx := context.Background()
result := db.MustExecContext(ctx,
"INSERT INTO merchants(email, name, photo_url)\nVALUES (?,?,?)",
merchant.Email, merchant.Name, merchant.PhotoURL)
作成したデータを抽出する(複数) エンドポイントは"/merchants/list"とする RestfulのURL設計としては適切ではないのだが、 一旦はこれで。
chiを導入する net/httpのハンドラー周りを薄くラップしたライブラリとなる
- 指定したIDのMerchantのデータを取得する
- 指定したIDのMerchantのデータを編集する 例えば名前を変更する(そのようなユースケースはあまり実態に即してないけど)
- Merchantの新規登録のhtml form画面を作成する