golang数据库schema迁移嵌入二进制文件插件库schema的使用
Golang数据库Schema迁移嵌入二进制文件插件库Schema的使用
Schema - Go的数据库迁移工具
一个可嵌入的库,用于对Go应用程序的database/sql
schema应用变更。
特性
- 支持集群环境的云友好设计
- 支持在embed.FS中的迁移(需要Go 1.16+的go:embed)
- 仅依赖Go标准库
- 单向迁移(没有"down"迁移的复杂性)
使用说明
创建一个schema.Migrator
在你的引导/配置/数据库连接代码中,然后调用它的Apply()
方法,传入你的数据库连接和一个*schema.Migration
结构体切片。
.Apply()
函数会找出哪些提供的迁移尚未在数据库中执行(基于ID),并按ID的字母顺序为每个迁移执行Script
。
使用go:embed(需要Go 1.16+)
Go 1.16添加了将文件目录作为嵌入式文件系统(embed.FS
)嵌入到二进制文件中的功能。
假设你有一个名为my-migrations/
的SQL文件目录与你的main.go文件相邻,你可以这样运行:
//go:embed my-migrations
var MyMigrations embed.FS
func main() {
db, err := sql.Open(...) // 或者你获取*sql.DB的方式
migrations, err := schema.FSMigrations(MyMigrations, "my-migrations/*.sql")
migrator := schema.NewMigrator(schema.WithDialect(schema.MySQL))
err = migrator.Apply(db, migrations)
}
WithDialect()
选项接受:schema.MySQL
、schema.Postgres
、schema.SQLite
或schema.MSSQL
。
使用内联迁移结构体
如果你运行的是较早版本的Go,需要手动创建Migration{}结构体:
db, err := sql.Open(...)
migrator := schema.NewMigrator() // Postgres是默认的Dialect
migrator.Apply(db, []*schema.Migration{
&schema.Migration{
ID: "2019-09-24 Create Albums",
Script: `
CREATE TABLE albums (
id SERIAL PRIMARY KEY,
title CHARACTER VARYING (255) NOT NULL
)
`
},
})
完整示例Demo
下面是一个完整的示例,展示如何使用schema库进行数据库迁移:
package main
import (
"database/sql"
"embed"
"log"
"github.com/adlio/schema"
_ "github.com/lib/pq" // PostgreSQL驱动
)
//go:embed migrations/*.sql
var migrationFS embed.FS
func main() {
// 连接数据库
db, err := sql.Open("postgres", "user=postgres dbname=mydb sslmode=disable")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 从嵌入式文件系统加载迁移
migrations, err := schema.FSMigrations(migrationFS, "migrations/*.sql")
if err != nil {
log.Fatal(err)
}
// 创建迁移器并应用迁移
migrator := schema.NewMigrator(
schema.WithDialect(schema.Postgres),
schema.WithTableName("my_migrations"),
)
if err := migrator.Apply(db, migrations); err != nil {
log.Fatal(err)
}
log.Println("Migrations applied successfully!")
}
迁移规则
-
永远不要更改已经在你数据库上执行的迁移的
ID
(文件名)或Script
(文件内容)。如果你犯了错误,你需要在后续的迁移中纠正它。 -
为迁移
ID
/文件名使用一致的、描述性的格式。考虑用今天的日期作为前缀。例如:ID: "2019-01-01T13:45:00 Creates Users" ID: "2001-12-18 001 Changes the Default Value of User Affiliate ID"
支持的数据库
- PostgreSQL (仅database/sql驱动)
- SQLite
- MySQL / MariaDB
- SQL Server
包的设计理念
- 数据库凭证是运行时配置细节,但数据库schema是构建时应用程序依赖,这意味着它应该被"编译"到构建中,不应该依赖外部工具。
- 使用外部命令行工具进行schema迁移不必要地复杂化了测试和部署。
- SQL是用于指定SQL schema变更的最佳语言。
- "Down"迁移增加了不必要的复杂性,不经常使用,并且在需要使用时很难正确测试。
- 应该避免深度依赖链,特别是在编译的二进制文件中。
更多关于golang数据库schema迁移嵌入二进制文件插件库schema的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复