【问题标题】:Writing a goose go migration with gorm用 gorm 写 goose go migration
【发布时间】:2016-01-02 18:03:46
【问题描述】:

默认的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 一起使用?

【问题讨论】:

    标签: go database-migration go-gorm


    【解决方案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 实现自定义包装器;-)

    【讨论】:

    猜你喜欢
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多