【问题标题】:gorm exec return ID from insert transaction with raw sqlgorm exec 从使用原始 sql 的插入事务返回 ID
【发布时间】:2021-06-08 18:28:05
【问题描述】:

我正在使用 GORM 运行 SQL 查询。我正在尝试将ExecINSERT 语句作为TRANSACTION,因为我需要能够返回最新插入的ID。

这是一个代码sn-p:

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。

有什么想法吗?

【问题讨论】:

标签: go go-gorm go-gin


【解决方案1】:

虽然我不知道您的确切用例,但您似乎并没有真正充分利用 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)

之后,原来的something变量会包含刚刚创建的ID:

{
  "ID": 26,
  "A": "Foo",
  "B": "Bar"
}

【讨论】:

    猜你喜欢
    • 2016-08-13
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多