迁移 [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示例在新窗口中打开