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

sqlitex

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: 16 Imported by: 0

Documentation

Overview

Package sqlitex 提供基于 GORM 的 SQLite 单库连接池和统一查询日志。

创建入口只接收 Config,客户端由应用通过 Close 或 CloseAll 显式关闭。 应用启动时创建客户端,查询时传入请求 context;以下示例需导入 github.com/bpcoder16/pixiu/infra/sqlitex 和 time:

foreignKeys := true
client, err := sqlitex.New(sqlitex.Config{
    Name:         "local",
    DSN:          "file:/var/lib/app/local.db",
    JournalMode:  sqlitex.JournalModeWAL,
    Synchronous:  sqlitex.SynchronousFull,
    BusyTimeout:  5 * time.Second,
    ForeignKeys:  &foreignKeys,
    LogSQL:       true,
})
if err != nil {
    return err
}
defer client.Close() // 应用退出时在 logit.Close 前调用
if autoMigrate {
    if err := client.DB(ctx).AutoMigrate(&LocalRecord{}); err != nil {
        return err
    }
}
return client.DB(ctx).Create(&record).Error

多个逻辑库可用 NewNamed 按 Config.Name 登记,再用 Named 取得共享客户端。 使用 lifecycle 统一关闭时,应先登记日志关闭函数,再登记 CloseAll,使日志 最后关闭。以下示例还需导入 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(sqlitex.CloseAll); err != nil {
    return errors.Join(err, stack.Close())
}
_, err := sqlitex.NewNamed(cfg)
if err != nil {
    return errors.Join(err, stack.Close())
}
client := sqlitex.Named(cfg.Name)
_ = client
// 停止使用命名客户端的任务后统一关闭。
return stack.Close()

业务仓库负责创建目录、决定迁移时机及配置 SQLite 参数。常用的日志模式、 锁等待时间、同步级别和外键可用 Config 字段设置,其他驱动参数仍可写入 DSN。 默认连接池只有 一条连接,事务回调内应继续使用传入的 tx 进行查询。LogSQL 控制正常 查询的 Info 日志;错误和慢查询始终记录 SQL。InterpolateSQL 默认关闭, 需要输出展开参数后的 SQL 时可显式开启。已调用 logit.WithStart 的请求会 以 SQLite_<Name> 为前缀自动编号记录下游耗时,供 logit.InfoDuration 汇总。命名客户端由 CloseAll 关闭;独立 New 创建的客户端仍由调用方单独关闭。

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

if _, err := sqlitex.NewDefault(cfg); err != nil {
    return err
}
return sqlitex.Default().DB(ctx).Create(&record).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 SQLite 连接池。

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, error)

New 创建并验活连接池;失败时关闭已创建的连接池。 客户端由调用方通过 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) DB

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

DB 返回绑定 ctx 的 GORM 会话。

type Config

type Config struct {
	// Name 是必填的逻辑库名,用作日志中的下游标识。
	Name string
	// DSN 是必填的 SQLite 文件路径或驱动连接字符串;显式配置项优先于同名 DSN 参数,重复的 mode、cache、vfs 参数无效。
	DSN string
	// JournalMode 设置 SQLite 日志模式;空值沿用 DSN 或驱动默认值。
	JournalMode JournalMode
	// BusyTimeout 设置锁等待时间,精度为毫秒;零值沿用 DSN 或驱动默认值。
	BusyTimeout time.Duration
	// Synchronous 设置同步级别;空值沿用 DSN 或驱动默认值。
	Synchronous SynchronousMode
	// ForeignKeys 设置是否启用外键;nil 沿用 DSN 或驱动默认值。
	ForeignKeys *bool
	// Pool 配置连接池;私有内存库只能使用一个打开连接,内存库不能设置回收时间。
	Pool Pool
	// SlowThreshold 是慢查询阈值,零值默认 200 毫秒。
	SlowThreshold time.Duration
	// LogSQL 控制是否为正常查询记录包含 SQL 的 Info 日志;慢查询和错误始终包含 SQL。
	LogSQL bool
	// InterpolateSQL 控制日志 SQL 是否用参数值替换占位符;开启后可能记录业务数据。
	InterpolateSQL bool
}

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

type JournalMode

type JournalMode string

JournalMode 是 SQLite 支持的日志模式;空值沿用 DSN 或驱动默认值。

const (
	JournalModeDelete   JournalMode = "DELETE"
	JournalModeTruncate JournalMode = "TRUNCATE"
	JournalModePersist  JournalMode = "PERSIST"
	JournalModeMemory   JournalMode = "MEMORY"
	JournalModeWAL      JournalMode = "WAL"
	JournalModeOff      JournalMode = "OFF"
)

type Pool

type Pool = gormcore.PoolConfig

Pool 配置 SQLite 连接池。打开数和空闲数零值默认 1;连接寿命与空闲时间 零值不主动回收。负值无效,空闲数不能超过打开数。

type SynchronousMode

type SynchronousMode string

SynchronousMode 是 SQLite 支持的同步级别;空值沿用 DSN 或驱动默认值。

const (
	SynchronousOff    SynchronousMode = "OFF"
	SynchronousNormal SynchronousMode = "NORMAL"
	SynchronousFull   SynchronousMode = "FULL"
	SynchronousExtra  SynchronousMode = "EXTRA"
)

Jump to

Keyboard shortcuts

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