จาก sql ด้วย sqlc, DBML และ Taskfile ใน project ที่ทำอยู่นั้น มีการใช้งาน database ตลอด พบว่าต้องเขียนชุดคำสั่ง sql และ เขียน code ซ้ำ ๆ เยอะ จึงเกิดความขี้เกียจ ก็เลยหาแนวทางแก้ไขหน่อย จึงพบแนวทางที่น่าสนใจ และ นำมาใช้งานดังนี้
สิ่งที่ใช้งานประกอบไปด้วย
มาดูการใช้งานกัน
ขั้นตอนการทำงานเป็นดังรูป
โดยใน Taskfile จะเขียนดังนี้
version: '3' silent: true tasks: generate-schema: desc: Generate db schema from dbml cmds: - dbml2sql db/sql/schema.dbml --postgres -o db/sql/schema.sql generate-code: desc: Generate code from sql with Sqlc cmds: - docker container run --rm -v $(pwd):/src -w /src kjconroy/sqlc generate
ทำการ run ตามนี้
task generate-schema task generate-code
ตัวอย่างของ code ที่ generate ได้เป็นดังนี้
package db import ( "context" "database/sql" ) const createAuthor = `-- name: CreateAuthor :one INSERT INTO authors ( name, bio ) VALUES ( $1, $2 ) RETURNING id, name, bio ` type CreateAuthorParams struct { Name string Bio sql.NullString } func (q *Queries) CreateAuthor(ctx context.Context, arg CreateAuthorParams) (Author, error) { row := q.db.QueryRowContext(ctx, createAuthor, arg.Name, arg.Bio) var i Author err := row.Scan(&i.ID, &i.Name, &i.Bio) return i, err } const deleteAuthor = `-- name: DeleteAuthor :exec DELETE FROM authors WHERE id = $1 ` func (q *Queries) DeleteAuthor(ctx context.Context, id int32) error { _, err := q.db.ExecContext(ctx, deleteAuthor, id) return err }
เพียงเท่านี้ก็ได้ process การทำงานที่ automate มากขึ้น ช่วยลดภาระงานไปได้เยอะเลย เพียงแค่ออกแบบ table ใน DBML เท่านั้นเอง
สามารถดูตัวอย่าง code เพิ่มเติมได้ที่ GitHub::Up1