dousi8237 2016-01-02 18:03
浏览 37
已采纳

用gorm编写鹅围棋迁移

A default goose go migration prepares a function providing an *sql.Tx:

A transaction is provided, rather than the DB instance directly, since goose also needs to record the schema version within the same transaction. Each migration should run as a single transaction to ensure DB integrity, so it's good practice anyway.

I would like to write my migration using gorm migrations, but I’m not sure how to use the given transaction to that purpose. Here’s an example:

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

The build gives me txn.CreateTable undefined (type *sql.Tx has no field or method CreateTable) as expected. How can I grab the transaction for use with gorm?

  • 写回答

1条回答 默认 最新

  • doupa9062 2016-01-02 21:09
    关注

    goose know nothing about gorm and his functions (CreateTable etc.)

    Look at the end of goose / lib / goose / migration_go.go

    goose just create transaction

    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)
    }
    

    and use sql.Tx from "database/sql" package

    but you can implement custom wrapper using gorm ;-)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 Markdown在VScode编辑器下插入视频
  • ¥15 stm32c8t6工程,使用hal库
  • ¥100 有偿求易语言word文档取doc和docx页数方法或模块
  • ¥15 找能接spark如图片的,可议价
  • ¥15 关于#单片机#的问题,请各位专家解答!
  • ¥15 博通raid 的写入速度很高也很低
  • ¥15 目标计数模型训练过程中的问题
  • ¥100 Acess连接SQL 数据库后 不能用中文筛选
  • ¥15 用友U9Cloud的webapi
  • ¥20 电脑拓展屏桌面被莫名遮挡