为了账号安全,请及时绑定邮箱和手机立即绑定

gorm exec 从插入事务返回 ID 与原始 sql

gorm exec 从插入事务返回 ID 与原始 sql

Go
四季花海 2022-08-15 16:40:01
我正在使用 GORM 来运行 SQL 查询。我正在尝试将语句作为,因为我需要能够返回最新插入的ID。ExecINSERTTRANSACTION下面是一个代码片段:query := `        START TRANSACTION;            INSERT INTO something (a, b, c)            VALUES (@arg1, @arg2, @arg3);            SELECT LAST_INSERT_ID();        COMMIT;`    result := DB.Exec(        query,        sql.Named("arg1", "aaa"),        sql.Named("arg2", "bbb"),        sql.Named("arg3", "ccc"),    )我已经通读了GORM交易文档,但这些例子与我的用例有很大的不同。我的目标是创建一个 INSERT 语句,并最终返回该创建中的最新 ID。使用 MySQL。有什么想法吗?
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

虽然我不知道你的确切用例,但似乎在这里你并没有真正充分利用GORM,并且可以通过使用它的方法而受益。


type Something struct {

    ID int

    A  string

    B  string

}


something := Something{

    A: "Foo",

    B: "Bar",

}


db.Transaction(func(tx *gorm.DB) error {

    // save your item in the transaction (use 'tx' from this point, not 'db')

    if err := tx.Create(&something).Error; err != nil {

        fmt.Println(err.Error())

        // returning any error will rollback

        return err

    }


    // do anything else within the transaction...


    // return nil will commit the whole transaction

    return nil

})


fmt.Printf("%+v/n", something)

之后,原始变量将包含刚刚创建的 ID:something


{

  "ID": 26,

  "A": "Foo",

  "B": "Bar"

}


查看完整回答
反对 回复 2022-08-15
?
阿晨1998

TA贡献2037条经验 获得超6个赞

只需执行此示例


     var ID int64

     tx.Raw("INSERT INTO yourTable (yourColumn) VALUES ('testInsertValue') RETURNING 

     id").Scan(&ID)

我使用tx假设你已经把你的交易设置为tx,你可以用多种方式进行交易。对于返回值,您可以使用模型的结构,而不是像示例中那样仅使用 var ID。


谢谢。


查看完整回答
反对 回复 2022-08-15
  • 2 回答
  • 0 关注
  • 1228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信