github.com/jmoiron/sqlx使用注意
使用sqlx时,我们通常是定义一个Database接口,实现此接口的结构体,包含*sqlx.DB,如下。Database接口提供各类查询方法,database实现是通过sqlx.db完成的。
type Database interface {
...
}
type database struct {
db *sqlx.DB
}
我们通常是在代码的repository层的结构体中,包含Database接口实现,例如:
type goodsRepository struct {
db Database
log logger.Logger
}
在reposttory中完成各种业务需要的数据库操作,如下, 我们要查询某个表,比如goods商品表,就需要定义一个持久化对象(xxxPo),使用sqlx的查询方法时,要把结果映射到po对象上。
func (g goodsRepository) QueryGoodsList(ctx context.Context, page, limit int) (*model.PageGoodsListRes, error) {
...
q:= `select * from goods...`
...
goodsList := []goodsListPO{}
err := pr.db.SelectContext(ctx, &goodsList, q)
}
// 商品持久化对象
type goodsPO strruct{
Id string `db:"id"`
GoodsName string `db:"goods_name"` //商品名称
...
}
注意事项:
因为我们可能会不断扩充表字段,如果哪天新增一个GoodsSize字段,但是po中没有,查询采用了select *,就会报错missing destination name goods_size in *[]postgres.goodsPO。 为了避免数据库表新增字段,代码没变导致报错,最后在select查询中列出具体要查询的字段,比如select id,goods_name from goods。