Aaron Li

Blog-App: 整合 sqlc 到 server

Table of Content

目標

  1. 實作一個 high level 的 service, 讓 api service 可以去呼叫我們寫好的 query

DB Store

在上一張提到 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(...)