Go 中的 database/sql
database/sql 是 Go 标准库中的数据库访问抽象层,负责连接、查询、事务和结果扫描的统一接口,而不直接实现具体数据库协议。
#type / concept
#status / growing
#tech / dev / backend
#resource / go
[!info] related notes
- 所属 MOC: Go 数据访问 MOC
- 相邻主题: 数据库 MOC
- 并列概念: GORM, Go JSON 与序列化
Go 中的 database/sql
一句话定义
database/sql 是 Go 标准库里的通用数据库访问抽象,用统一接口组织连接、查询、事务和结果扫描,但真正的数据库协议实现由具体 driver 提供。
核心机制 / 工作原理
理解 database/sql,最重要的是先分清两层:
database/sql提供抽象和调用模型- 具体数据库驱动提供底层实现
这让 Go 数据访问主线通常建立在:
DBQuery/ExecRowsScanTx
这些对象和操作上。
最小例子 / 最小场景
row := db.QueryRow("SELECT name FROM users WHERE id = ?", id)
err := row.Scan(&name)
这里最关键的心智是:
- 你不是直接拿到结构体
- 你是在处理“SQL 结果 -> Go 值”的映射过程
为什么这部分重要
哪怕后面使用 ORM,理解 database/sql 仍然很关键。因为它决定了:
- 连接池和事务的大致模型
- 查询结果如何进入程序
- 抽象层到底帮你屏蔽了什么,没屏蔽什么
边界与易混淆点
database/sql不是 ORM- 驱动、连接池、事务和结果扫描是不同层次的问题
- ORM 的便利并不会消除底层 SQL 和事务边界