sqlitex

package
v0.1.2 Latest Latest
Warning

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

Go to latest
Published: Nov 4, 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()

file: URI 中 # 后是 fragment,连接参数应放在 # 前。URI 文件名中的井号写作 %23;普通文件路径可直接写 #。

业务仓库负责创建目录、决定迁移时机及配置 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 文件路径或驱动连接字符串;file: URI 中首个字面 # 及其后内容会被忽略。
	// 显式配置项优先于同名 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