Help us shape the future of Go! Take the 2026 Go Developer Survey

pgsqlx

package
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 3, 2026 License: Apache-2.0 Imports: 19 Imported by: 0

Documentation

Overview

Package pgsqlx 提供基于 GORM 的 PostgreSQL 连接池、显式主从选择和统一查询日志。

创建入口只接收 Config,客户端由应用通过 Close 或 CloseAll 显式关闭。 InitTimeout 为全部主从端点共用的初始化超时,默认 10 秒;实际操作仍由请求 context 控制。 应用启动时创建客户端,查询时传入请求 context;以下示例需导入 context、 github.com/bpcoder16/pixiu/infra/pgsqlx 和 gorm.io/gorm:

client, err := pgsqlx.New(pgsqlx.Config{
    Name: "orders",
    SessionTimeZone: "UTC",
    LogSQL: true,
    Master: pgsqlx.Endpoint{
        Host: "db.example.com",
        Database: "orders",
        Username: dbUser,
        Password: dbPassword,
        Charset: "UTF8",
        Location: "UTC",
        SSLMode: "verify-full",
    },
})
if err != nil {
    return err
}
defer client.Close() // 应用退出时在 logit.Close 前调用
if autoMigrate {
    if err := client.MasterDB(ctx).AutoMigrate(&Order{}); err != nil {
        return err
    }
}
if err := client.MasterDB(ctx).Transaction(func(tx *gorm.DB) error {
    return tx.Create(&order).Error
}); err != nil {
    return err
}
return client.SlaveDB(ctx).First(&order, id).Error

多个逻辑库可用 NewNamed 按 Config.Name 创建并登记;Named 按名称取得共享客户端。 使用 lifecycle 统一管理资源时,由应用先登记日志关闭函数,再登记 CloseAll; 名称不存在或 CloseAll 开始后调用 Named 会 panic,需在启动时确认名称并先停止任务。 以下示例还需导入 errors、github.com/bpcoder16/pixiu/lifecycle 和 github.com/bpcoder16/pixiu/logit,logger 已由调用方创建:

var stack lifecycle.Stack
if err := stack.Register(func() error { return logit.Close(logger) }); err != nil {
    return err
}
if err := stack.Register(pgsqlx.CloseAll); err != nil {
    return errors.Join(err, stack.Close())
}
_, err := pgsqlx.NewNamed(cfg)
if err != nil {
    return errors.Join(err, stack.Close())
}
client := pgsqlx.Named(cfg.Name)
_ = client
// 停止使用命名客户端的任务后,统一关闭连接池,最后关闭日志。
return stack.Close()

业务仓库决定是否执行自动迁移,模型只传给主库。事务和要求读己之写的查询使用 MasterDB;其他可接受从库延迟的读取可使用 SlaveDB。GORM 的 Info、Warn、Error 诊断消息按对应级别记录;LogSQL 只控制正常查询的 SQL 日志。 Charset 固定为 UTF8;Location 默认 Asia/Shanghai,只解释无时区 timestamp,不改变 timestamptz。 初始化错误保留网络、TLS 和证书配置的具体原因,服务端错误保留 SQLSTATE; 返回错误不携带完整连接 URI 或含凭据的驱动配置。 ctx 已调用 logit.WithStart 时,每次 GORM Trace 以 PostgreSQL_<Name> 为前缀自动编号记录下游耗时, 供业务调用 logit.InfoDuration 汇总;直接调用底层 *sql.DB 不经过 Trace。

单个逻辑下游可显式初始化默认客户端,省去每次按名称查询。cfg 已由应用构造:

if _, err := pgsqlx.NewDefault(cfg); err != nil {
    return err
}
return pgsqlx.Default().MasterDB(ctx).Create(&order).Error

启动阶段由调用方串行调用 NewNamed 和 NewDefault,不并发初始化。 Name 仍必填;Default() 与 Named(cfg.Name) 返回同一实例,New 和 NewNamed 不自动设置默认实例。重复默认初始化报错;失败可重试。未初始化或 CloseAll 开始后调用 Default 会 panic。应用停止查询后调用 CloseAll,默认与命名实例 统一关闭一次,日志最后关闭;默认实例不要单独登记 Close。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func CloseAll

func CloseAll() error

CloseAll 关闭全部已登记的命名及默认客户端,每个实例只关闭一次。 重复调用返回同一次关闭结果。 应用应先停止使用客户端的任务,再调用 CloseAll。

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client 持有一个主库及零个或多个从库的 GORM 连接池。

func Default

func Default() *Client

Default 返回显式初始化的默认客户端,与 Named(cfg.Name) 是同一实例。 未初始化或 CloseAll 开始后调用会 panic;New 和 NewNamed 不设置默认实例。

func Named

func Named(name string) *Client

Named 返回已登记的命名客户端;名称不存在或关闭开始后调用会 panic。

func New

func New(cfg Config) (client *Client, err error)

New 创建并验活全部端点;全部端点共用 InitTimeout 预算,失败时关闭已创建的连接池。 客户端由调用方通过 Close 显式关闭,查询时再传入操作 context。

func NewDefault

func NewDefault(cfg Config) (*Client, error)

NewDefault 创建默认客户端,同时按 Config.Name 登记;已有默认实例时返回错误。 Name 仍必填;创建失败可重试,初始化与关闭约束与 NewNamed 相同。

func NewNamed

func NewNamed(cfg Config) (*Client, error)

NewNamed 创建并按 Config.Name 登记客户端。名称重复时不替换已有实例。 启动阶段由调用方串行创建;初始化完成后可并发查询。 初始化完成后不得再调用,所有创建返回后才开始查询,关闭须在初始化之后执行。

func (*Client) Close

func (c *Client) Close() error

Close 关闭所有连接池;重复调用返回首次关闭结果。

func (*Client) MasterDB

func (c *Client) MasterDB(ctx context.Context) *gorm.DB

MasterDB 返回带 ctx 的主库会话。

func (*Client) SlaveDB

func (c *Client) SlaveDB(ctx context.Context) *gorm.DB

SlaveDB 返回带 ctx 的从库会话;未配置从库时使用主库。

type Config

type Config struct {
	// InitTimeout 限制全部端点连接、验活和版本探测的总耗时;零值默认 10 秒,负值无效。
	InitTimeout time.Duration
	// Name 是必填的逻辑库名,用作日志中的下游标识。
	Name string
	// Master 是必填的主库连接配置,MasterDB 使用它。
	Master Endpoint
	// Slaves 是可选的从库配置;SlaveDB 轮询选择,未配置时回退主库。
	Slaves []Endpoint
	// SessionTimeZone 设置新连接的 PostgreSQL 会话时区;空值沿用服务端默认值。
	SessionTimeZone string
	// SlowThreshold 是慢查询阈值,零值默认 200 毫秒;无其他错误且耗时严格超过阈值时记录 Warn。
	SlowThreshold time.Duration
	// LogSQL 控制正常查询是否记录带 SQL 的 Info 日志;慢查询和错误始终包含 SQL。
	LogSQL bool
	// InterpolateSQL 控制日志 SQL 是否用参数值替换占位符;开启后可能记录业务数据。
	InterpolateSQL bool
	// DisableStatementCache 为不支持预备语句缓存的代理选择 pgx exec 模式。
	DisableStatementCache bool
}

Config 配置一个逻辑 PostgreSQL 数据库及其日志行为。

type Endpoint

type Endpoint struct {
	// Host 是必填的主机名或 IP 地址,不包含端口。
	Host string
	// Port 是 TCP 端口,零值使用 5432;有效范围为 1 到 65535。
	Port int
	// Database 是必填的数据库名。
	Database string
	// Username 是必填的数据库用户名。
	Username string
	// Password 是连接密码,可以为空;调用方不要将其写入日志。
	Password string
	// Charset 是客户端编码;空值或 UTF8/UTF-8 均使用 UTF8,其他编码无效。
	Charset string
	// Location 解释无时区 timestamp 的 Go 时区;空值使用 Asia/Shanghai。
	Location string
	// SSLMode 是 pgx 支持的 TLS 模式,空值使用 prefer。
	SSLMode string
	// SSLRootCert、SSLCert、SSLKey 是 pgx 使用的证书文件路径。
	SSLRootCert string
	SSLCert     string
	SSLKey      string
	// DialTimeout 是建立连接的超时,零值不设置驱动级超时。
	DialTimeout time.Duration
	// Pool 是此端点的连接池配置,零值使用 Pool 的默认值。
	Pool Pool
}

Endpoint 表示一个主库或从库的 TCP 连接配置。

type Pool

type Pool = gormcore.PoolConfig

Pool 配置单个端点的连接池。零值分别采用 100、min(10, MaxOpenConns)、 3 分钟和 1 分钟;负值无效,空闲数不能超过打开数。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL