登录
首页 >  Golang >  Go问答

怎样在数据库中插入数据后检索该行的值?

来源:stackoverflow

时间:2024-03-24 10:42:53 241浏览 收藏

在 Golang 中使用数据库时,执行插入操作后获取受影响行的值非常重要,尤其是在涉及自动增量 ID 列时。使用 PostgreSQL 驱动程序时,`res.LastInsertId()` 方法不受支持,但可以使用 `db.QueryRow()` 方法检索最后插入的 ID。通过在查询中使用 `RETURNING` 子句,可以在插入时获取 ID 值。本文提供了一个代码示例,展示了如何使用 `db.QueryRow()` 检索最后插入的 ID,并针对多个插入提供了相应的代码。

问题内容

我正在使用 golang 将数据插入数据库。基本上我的查询如下所示

var cols = "(col1, col2, col3)"
var values = "($1, $2, $3)"
var query = fmt.Sprintf("INSERT INTO %s %s VALUES %s", myTable, cols, values)

res, err := db.Exec(query, thing.val1, thing.val2, thing.val3)

res 提供的唯一信息是lastinsertid 和受影响的行数。但我需要的是受影响的行。原因是我将数据插入到具有自动增量 id 列的 psql 数据库中 - 所以我希望数据随之返回。

例如,使用 java hibernate,我可以执行此答案所解释的操作。我不必重新查询数据库来获取 id。

编辑:我尝试使用lastinsertid方法并收到此错误

此驱动程序不支持 lastinsertid


正确答案


假设您只想在名为 id 的列中自动递增值,这是一个带有 pq driver 的插入

var cols = "(col1, col2, col3)"
var values = "($1, $2, $3)"
var query = fmt.sprintf(
    "insert into %s %s values %s returning id",
    mytable, cols, values,
)
var id int
if err := db.queryrow(
    query,
    thing.val1, thing.val2, thing.val3,
).scan(&id); err != nil {
    panic(err)
}
fmt.println("id: ", id)

对于多个插入:

var cols = "(col1, col2, col3)"
var values = "($1, $2, $3),($4, $5, $6)"
var query = fmt.sprintf(
    "insert into %s %s values %s returning id",
    mytable, cols, values,
)
var ids []int
rows, err := db.query(
    query,
    thing.val1, thing.val2, thing.val3,
    thing.val4, thing.val5, thing.val6,
)
if err != nil {
    panic(err)
}
for rows.next() {
    var id int
    if err := rows.scan(&id); err != nil {
        panic(err)
    }
    ids = append(ids, id)
}
fmt.println("ids: ", ids)

res.lastinsertid() 在 postgres 驱动程序中不受支持。不过,mysql 驱动程序支持它。

db.exec() 不会返回最后插入的 id,但 db.queryrow() 会返回。

为了更好地理解,您可以参考这个link

在这里,我添加了一个可能对您有帮助的示例。

var id int
err := db.QueryRow("INSERT INTO user (name) VALUES ('John') RETURNING id").Scan(&id)
if err != nil {
...
}

今天关于《怎样在数据库中插入数据后检索该行的值?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>