迁移 [PostgreSQL MySQL]
您可以编写迁移来更改数据库模式或数据。迁移可以是常规的 Go 函数,也可以是包含 SQL 命令的文本文件。
迁移名称
您应该将每个迁移放在单独的文件中。迁移文件名由唯一的迁移名称 (20210505110026
) 和注释 (add_foo_column
) 组成,例如 20210505110026_add_foo_column.go
。
迁移状态
Bun 将已完成的迁移名称存储在 bun_migrations
表中,以决定要运行哪些迁移。它还使用这些信息来回滚迁移。
当迁移失败时,Bun 仍然将迁移标记为已应用,以便您可以回滚部分应用的迁移以清理数据库并尝试再次运行迁移。
迁移组和回滚
当有多个迁移要运行时,Bun 会将迁移作为一个组一起运行。在回滚期间,Bun 会还原最后一个迁移组(而不是单个迁移)。通常这是可取的,因为它会将数据库回滚到最后一个已知的稳定状态。
要回滚单个迁移,您需要回滚最后一个组,删除要跳过的迁移,然后再次运行迁移。或者,您可以添加一个包含所需更改的新迁移。
基于 Go 的迁移
基于 Go 的迁移是可以在 main.go
文件中创建的迁移集合中注册的常规 Go 函数。它可以执行任意代码。
package migrations
import (
"github.com/uptrace/bun/migrate"
)
// A collection of migrations.
var Migrations = migrate.NewMigrations()
然后,在单独的文件中,您应该使用 MustRegister
方法定义和注册迁移,例如,在 20210505110026_test_migration.go
中
package migrations
import (
"context"
"fmt"
"github.com/uptrace/bun"
)
func init() {
Migrations.MustRegister(func(ctx context.Context, db *bun.DB) error {
fmt.Print(" [up migration] ")
return nil
}, func(ctx context.Context, db *bun.DB) error {
fmt.Print(" [down migration] ")
return nil
})
}
有关详细信息,请参阅 bun-starter-kit 和 示例。
基于 SQL 的迁移
基于 SQL 的迁移是一个包含一个或多个 SQL 命令的扩展名为 .up.sql
的文件。您可以使用 --bun:split
行作为分隔符来创建包含多个语句的迁移。
SELECT 1
--bun:split
SELECT 2
您可以使用 Discover
方法注册此类迁移
//go:embed *.sql
var sqlMigrations embed.FS
func init() {
if err := Migrations.Discover(sqlMigrations); err != nil {
panic(err)
}
}
要创建事务性迁移,请使用 .tx.up.sql
扩展名。
有关详细信息,请参阅 bun-starter-kit 和 示例。