在上一張提到 sqlc 會將 sql 轉換成 golang. 生成的 code 會放在 app/pkg/db/sqlc
, 具體會生成哪些 code 呢?
. └── pkg └── db └── sqlc ├── db.go ├── models.go <--- 根據 schema 生成的各個 struct ├── querier.go <--- 定義好依照我們的 sql 轉換成的 golang code 的 interface └── user.sql.go <--- 定義好依照我們的 sql 轉換成的 golang code
在 DB Store 想要達成的目標是不論將來是否換 db 都可以使用目前我們已經定好的 sql, 為了達成這一點我們可以使用 querier 定義好的 interface
type Store interface { Querier } type SQLStore struct { *Queries db *sql.DB } func NewStore(db *sql.DB) Store { return &SQLStore{ db: db, Queries: New(db), } }
之後我們可以這樣去使用, 而且也能夠很好的 integrate 不同的 database, 只需要加在 Store
即可
db, err := sql.Open(...) ... store := NewStore(db) store.CreateUser(...)
要如何在我們的 server 裡使用呢? 只需要加進 server 的 member 就可以在 server 內使用這些 db operation 了
# app/pkg/server/server.go type Server struct { store sqlc.Store router *gin.Engine } func NewServer(store sqlc.Store) *Server { router := gin.Default() server := &Server{ router: router, store: store, } server.setUpRouter() return server } # server.store.CreateUser(...)