0Pricing
Go Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. database/sql 与驱动程序
  2. sqlx:结构体扫描与命名查询
  3. pgx:高性能 PostgreSQL 驱动程序
  4. 事务与迁移
← 返回 Go Academy