在 Golang 專案用 sqlc 實現資料庫 CRUD
在 Go 專案當中有不少方法可實現 SQL CRUD,在此比較其中三種方法。
- Database/SQL
優點:原生套件、查詢速度快
缺點:代碼複雜
- GORM
優點:代碼簡潔
缺點:查詢速度慢
其他:語法結構不像SQL(需學習 ORM 函式)
-SQLC
優點:代碼簡潔、查詢速度快、語法結構類似SQL
缺點:目前(2023年5月)僅支援 PostgreSQL、MySQL、SQLite
sqlc 官方文件及 GitHub 頁面
安裝 sqlc
$ brew install sqlc // madOS 可用 Homebrew 安裝 sqlc
$ sqlc version // 確認 sqlc 是否已安裝
$ sqlc init // 在專案資料夾產生 sqlc.yaml
編寫 sqlc.yaml
可從官方 GitHub 的分支 Tag 找到特定版本的說明文件,例如:v1.4.0 說明文件
也可參考官方網頁最新版的官方文件編寫 sqlc.yaml
以下為參考範例
sqlc.yaml
version: "1"
packages:
- name: "db"
path: "./db/sqlc"
queries: "./db/query"
schema: "./db/migration"
engine: "postgresql"
emit_json_tags: true
emit_prepared_queries: false
emit_interface: false
emit_exact_table_names: false
編寫 queries
承上述範例,由於 sqlc.yaml 設定了 queries: "./db/query",因此在該路徑新增相對應的 .sql 檔案,並根據 sqlc 官方文件的範例(如下所示)編寫 .sql 檔案。
sqlc 官方範例
-- name: CreateAuthor :one
INSERT INTO authors (
name, bio
) VALUES (
$1, $2
)
RETURNING *;
再看一個例子
-- name: ListAccounts :many
SELECT * FROM accounts
ORDER BY id
LIMIT $1
OFFSET $2;
產出 sqlc 相關檔案
$ sqlc generate // 日後若修改 *.sql 也可直接執行此指令,新內容會覆蓋舊內容。
以上指令會在指定路徑產生三個 .go 檔案(db.go, models.go, .sql.go),其中 .sql.go 當中若有幾處顯示代碼有誤,可能是因為專案未曾初始化 go.mod,因此需執行下列指令。
$ go mod init moduleName
接著根據終端機指示執行指令:
$ go mod tidy