golang开发日常注意

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。

相关推荐
java_logo4 分钟前
Docker 部署 CloudBeaver:轻松搭建网页数据库管理平台
数据库·docker·容器·数据库管理·dbeaver·轩辕镜像·cloudbeaver
Julien20041 小时前
管理机密(一)
运维·服务器·开发语言·学习方法
Chen_harmony1 小时前
七、STL与string类
开发语言·c++
沐晓时光1 小时前
C语言入门,字符串和字符串函数知识讲解
c语言·开发语言
李白客1 小时前
AI 数据库落地 NL2SQL:准确率卡在四成,问题在表注释不在模型
数据库
xxxiugou1231 小时前
C++命名空间与引用全解析
开发语言·c++
FluxDB1 小时前
FluxDB vs DBX vs DBeaver:GPUI、Tauri、Eclipse 三种技术栈实测
数据库·mysql
杨航 AI2 小时前
JEV的用法
java·前端·数据库
数据库小学妹2 小时前
MySQL分页结果不稳定:唯一键兜底与游标分页
数据库·mysql·dba
风翼靓崽2 小时前
mysql数据备份/恢复
数据库·mysql