Go 中的 database/sql

database/sql 是 Go 标准库中的数据库访问抽象层,负责连接、查询、事务和结果扫描的统一接口,而不直接实现具体数据库协议。

#type / concept #status / growing #tech / dev / backend #resource / go

[!info] related notes

Go 中的 database/sql

一句话定义

database/sql 是 Go 标准库里的通用数据库访问抽象,用统一接口组织连接、查询、事务和结果扫描,但真正的数据库协议实现由具体 driver 提供。

核心机制 / 工作原理

理解 database/sql,最重要的是先分清两层:

  • database/sql 提供抽象和调用模型
  • 具体数据库驱动提供底层实现

这让 Go 数据访问主线通常建立在:

  • DB
  • Query / Exec
  • Rows
  • Scan
  • Tx

这些对象和操作上。

最小例子 / 最小场景

row := db.QueryRow("SELECT name FROM users WHERE id = ?", id)
err := row.Scan(&name)

这里最关键的心智是:

  • 你不是直接拿到结构体
  • 你是在处理“SQL 结果 -> Go 值”的映射过程

为什么这部分重要

哪怕后面使用 ORM,理解 database/sql 仍然很关键。因为它决定了:

  • 连接池和事务的大致模型
  • 查询结果如何进入程序
  • 抽象层到底帮你屏蔽了什么,没屏蔽什么

边界与易混淆点

  • database/sql 不是 ORM
  • 驱动、连接池、事务和结果扫描是不同层次的问题
  • ORM 的便利并不会消除底层 SQL 和事务边界
创建于 2026/6/20 更新于 2026/6/20