sqlc 配合 pgx 使用事务
2 min read
获取链接
首先,需要通过 pgx 获取一个链接:
func Setup(ctx context.Context, DSN string) *pgx.Conn {
conn, err := pgx.Connect(ctx, DSN)
if err != nil {
log.Fatal(err)
}
return conn
}
开始事务
然后,在返回的链接结构体上,调用 Begin 方法来开始一个事务:
transaction, err := conn.Begin(ctx)
if err != nil {
Err(w, errcode.Database)
return
}
回滚数据
如果需要在发生错误时回滚,可以通过 defer 捕捉错误:
defer func() {
err := transaction.Rollback(ctx)
if !errors.Is(err, pgx.ErrTxClosed) {
panic(err)
}
}()
查询
查询时,需要使用 sqlc 生成的代码来和 pgx 配合。
sqlc 生成的代码如下:
func New(db DBTX) *Queries {
return &Queries{db: db}
}
通过传入 Begin 返回的事务来配合 sqlc:
query := New(transaction)
exist, err := query.CheckUserByUsername(ctx, params.Username)
if err != nil {
Err(w, errcode.Database)
return
}
if exist {
Err(w, errcode.UsernameOccupy)
return
}
提交
最后,通过调用 Commit 完成提交:
err = transaction.Commit(ctx)
if err != nil {
Err(w, errcode.Database)
return
}