1

默认goose go 迁移准备了一个函数,该函数提供*sql.Tx

提供了一个事务,而不是直接提供数据库实例,因为 goose 还需要在同一事务中记录架构版本。每次迁移都应作为单个事务运行以确保数据库完整性,因此无论如何这是一个好习惯。

我想使用gorm migrations编写我的迁移,但我不确定如何将给定的事务用于该目的。这是一个例子:

func Up_20151230135812(txn *sql.Tx) {
  txn.CreateTable(&User{})
}

构建txn.CreateTable undefined (type *sql.Tx has no field or method CreateTable)如预期的那样给了我。我如何获取交易以与 gorm 一起使用?

4

1 回答 1

1

goose 对 gorm 及其功能(CreateTable 等)一无所知

查看goose/lib/goose/migration_go.go的结尾

鹅只是创建交易

db, err := goose.OpenDBFromDBConf(&conf)
if err != nil {
    log.Fatal("failed to open DB:", err)
}
defer db.Close()

txn, err := db.Begin()
if err != nil {
    log.Fatal("db.Begin:", err)
}

{{ .Func }}(txn)

err = goose.FinalizeMigration(&conf, txn, {{ .Direction }}, {{ .Version }})
if err != nil {
    log.Fatal("Commit() failed:", err)
}

并使用“database/sql”包中的sql.Tx

但是您可以使用 gorm 实现自定义包装器;-)

于 2016-01-02T21:09:48.450 回答