pgx:高性能 PostgreSQL 驱动程序
pgxpool、Copy 协议与批量查询
pgx:高性能 PostgreSQL 驱动程序 是 CoddyKit 上的免费 Go Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。
什么是 pgx?
github.com/jackc/pgx/v5 是专用于 PostgreSQL 的 Go 驱动,提供原生 API,支持 database/sql 不具备的高级 PostgreSQL 功能:COPY 协议、通知、预处理语句缓存等。
使用 pgx 连接
使用 pgx 的原生连接池或 database/sql 兼容层:
// Native pgx pool
pool, err := pgxpool.New(ctx, "postgres://user:pass@localhost/mydb")
if err != nil { log.Fatal(err) }
defer pool.Close()pgxpool
pgxpool.New 会创建一个托管连接池。使用解析后的配置进行配置:
config, _ := pgxpool.ParseConfig("postgres://...")
config.MaxConns = 10
pool, _ := pgxpool.NewWithConfig(ctx, config)使用 pgx 查询
pgx 使用 pool.Query 和 pgx.CollectRows 辅助函数:
rows, _ := pool.Query(ctx, "SELECT id, name FROM users WHERE active=$1", true)
users, err := pgx.CollectRows(rows, pgx.RowToStructByName[User])RowToStructByName
pgx.RowToStructByName 使用小写字段名或 db 标签将列名映射到结构体字段,类似于 sqlx Select。
扫描单行
对单行查询使用 pool.QueryRow:
var name string
err := pool.QueryRow(ctx, "SELECT name FROM users WHERE id=$1", id).Scan(&name)批量查询
pgx 支持使用 pool.SendBatch 在一次网络往返中发送多个查询:
batch := &pgx.Batch{}
batch.Queue("SELECT name FROM users WHERE id=$1", 1)
batch.Queue("SELECT name FROM users WHERE id=$1", 2)
results := pool.SendBatch(ctx, batch)
defer results.Close()COPY 协议
对于批量插入,pgx 支持 PostgreSQL 的二进制 COPY 协议,其速度远快于单独执行 INSERT 语句:
conn, _ := pool.Acquire(ctx)
defer conn.Release()
conn.Conn().CopyFrom(ctx, pgx.Identifier{"users"}, []string{"name","email"}, pgx.CopyFromRows(rows))LISTEN/NOTIFY
pgx 支持 PostgreSQL 的 LISTEN/NOTIFY,可在数据库内部实现实时发布/订阅:
conn, _ := pool.Acquire(ctx)
conn.Exec(ctx, "LISTEN events")
notification, _ := conn.Conn().WaitForNotification(ctx)
fmt.Println(notification.Payload)pgx 与 database/sql
将 pgx 用作 database/sql 驱动,以兼容现有的基于 sql 的代码:
import pgxstdlib "github.com/jackc/pgx/v5/stdlib"
db := sql.OpenDB(pgxstdlib.OpenDBFromPool(pool))用于底层操作的 pgconn
pgconn 是 pgx 的底层连接库,提供原始 PostgreSQL 线协议。对于自定义协议操作或管理工具,可以使用它。
快速检查
为什么 pgx 的 COPY 协议比多条 INSERT 语句更快?
回顾:pgx
要点:
- 使用 pgxpool 管理连接池;使用 MaxConns 进行配置
- 使用 CollectRows + RowToStructByName 便捷地扫描结果
- 使用 SendBatch 在一次网络往返中执行多个查询
- 使用 CopyFrom 执行高吞吐量批量插入
常见问题解答
「pgx:高性能 PostgreSQL 驱动程序」课时是免费的吗?
是的 — 「pgx:高性能 PostgreSQL 驱动程序」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。
「pgx:高性能 PostgreSQL 驱动程序」这节课中我会学到什么?
pgxpool、Copy 协议与批量查询 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Go Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「pgx:高性能 PostgreSQL 驱动程序」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Go Academy 课中编写并运行代码吗?
能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- database/sql 与驱动程序
- sqlx:结构体扫描与命名查询
- pgx:高性能 PostgreSQL 驱动程序
- 事务与迁移