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。

相关推荐
猫头虎3 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
YUJIANYUE3 小时前
PHP纹路验证码
开发语言·php
仟濹3 小时前
【Java基础】多态 | 打卡day2
java·开发语言
孞㐑¥3 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
Re.不晚3 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言
八零后琐话3 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
3GPP仿真实验室3 小时前
【MATLAB源码】CORDIC-QR :基于Cordic硬件级矩阵QR分解
开发语言·matlab·矩阵
知南x4 小时前
【Ascend C系列课程(高级)】(1) 算子调试+调优
c语言·开发语言
忆~遂愿4 小时前
GE 引擎与算子版本控制:确保前向兼容性与图重写策略的稳定性
大数据·开发语言·docker
麦聪聊数据4 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构