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。

相关推荐
NineData1 小时前
NineData社区版V4.7.0发布!新增MySQL至TiDB等6条数据复制对比链路,SQL窗口新增谷歌云6种数据源类型
数据库·dba
晚霞的不甘1 小时前
实战进阶:构建高性能、高可用的 Flutter + OpenHarmony 车载 HMI 系统
开发语言·javascript·flutter
乄bluefox1 小时前
如何快速迁移redis - RedisShake(RDB方式)
数据库·redis·缓存
踢球的打工仔1 小时前
mysql外键
数据库·mysql
小尧嵌入式1 小时前
QT软件开发知识点流程及图片转换工具的开发
开发语言·arm开发·qt
网络点点滴1 小时前
pinia简介
开发语言·javascript·vue.js
爬山算法1 小时前
Redis(163)如何使用Redis实现计数器?
网络·数据库·redis
NineData1 小时前
NineData云原生智能数据管理平台新功能发布|2025年11月版
数据库·代码规范
white-persist1 小时前
【攻防世界】reverse | Mysterious 详细题解 WP
c语言·开发语言·网络·汇编·c++·python·安全