สรุปการ generate code

จาก sql ด้วย sqlc, DBML และ Taskfile ใน project ที่ทำอยู่นั้น มีการใช้งาน database ตลอด พบว่าต้องเขียนชุดคำสั่ง sql และ เขียน code ซ้ำ ๆ เยอะ จึงเกิดความขี้เกียจ ก็เลยหาแนวทางแก้ไขหน่อย จึงพบแนวทางที่น่าสนใจ และ นำมาใช้งานดังนี้

สิ่งที่ใช้งานประกอบไปด้วย

  • Taskfile สำหรับเขียน step การทำงาน ซึ่งดูง่ายกว่า Makefile มาก
  • DBML (Database Markup Language) สำหรับการออกแบบ table ต่าง ๆ และ generate มาเป็นคำสั่ง sql ได้เลย ง่ายมาก ๆ
  • sqlc สำหรับการสร้าง code เป็นภาษา Go จากคำสั่ง sql

มาดูการใช้งานกัน

ขั้นตอนการทำงานเป็นดังรูป

โดยใน 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

0
197