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 小时前
mongodb的日志分割
数据库·mongodb
不正经学生3 小时前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
门思科技3 小时前
LoRaWAN 设备类别:Class A、B、C 对比与选型指南
c语言·开发语言·php
恋恋西风6 小时前
C++ 理解 std::thread 在单核和多核上的行为差异
开发语言·c++
Brilliantwxx6 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
oradh6 小时前
Oracle TX 锁 Mode 4(Share)问题排查总结
数据库·oracle·tx 锁 mode 4·oracle tx 锁
BizzZ_7 小时前
C++(22)——类型转换和IO流
开发语言·c++
yi.Ist7 小时前
数据定义语言-DDL操作
数据库·学习·mysql·oracle·大海豚
小范同学_7 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言
geovindu7 小时前
CSharp: 万年历
开发语言·后端·c#·.net