Documentation
¶
Overview ¶
Package migrate 封装 goose 迁移的执行与并发保护。
两条关键设计:
- 启动自动迁移必须带锁。多实例同时启动时,无锁会让两个进程 并发执行同一批 DDL,轻则报错、重则留下半成品 schema。这里用 PostgreSQL 的 会话级 advisory lock 做互斥:拿不到锁的实例等待,而不是跳过迁移(跳过会让 实例在旧 schema 上运行,问题更隐蔽)。
- 核心与每个模块是独立的迁移来源,各有自己的版本表。插件生态里不可能协调 全局唯一的迁移编号,模块只需在自己的序列内递增。
实现基于 goose 的 Provider(实例级、无包级全局状态),并发构造多个 Migrator 也安全。
Index ¶
Constants ¶
View Source
const CoreName = "core"
CoreName 是核心迁移来源的名称。
它的版本表沿用 goose 默认名 goose_db_version,以兼容阶段 1、2 已迁移过的库。
View Source
const DefaultLockTimeout = 2 * time.Minute
DefaultLockTimeout 是未显式配置时等待迁移锁的上限。
等待是必要语义(多实例并发迁移必须串行),但必须有上限:数据库黑洞或 遗留会话会让 pg_advisory_lock 永久挂起,进而卡死整个启动流程。
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Migrator ¶
type Migrator struct {
// contains filtered or unexported fields
}
Migrator 按来源顺序执行迁移。
type Option ¶
type Option func(*Migrator)
Option 是 Migrator 的可选配置。
func WithLockDB ¶
WithLockDB 指定一个仅用于持有迁移 advisory lock 的独立连接池(容量 1 即可)。
goose 的 Provider 只接受 *sql.DB,无法让锁与迁移共用同一条会话;锁与迁移 若从同一池取连接,池容量为 1 时会互相等待。独立池把两者彻底隔开, 是单连接池部署的首选解法。
func WithLockTimeout ¶
WithLockTimeout 覆盖等待迁移锁的上限;d <= 0 时保持默认值。
Click to show internal directories.
Click to hide internal directories.