Go:如何使用NamedExec()在Postgresql上获取最后插入的id?

44

我在我的Go应用程序中使用jmoiron/sqlx库与我的PostgreSql服务器进行通信。在我的某些应用程序中,我有以下代码:

sqlQuery := `
    INSERT INTO table_to_insert  (
        code,
        status,
        create_time,
        create_by
    ) VALUES (
        '',
        0,
        CURRENT_TIMESTAMP,
        0
    ) RETURNING id
`

datas, err := tx.NamedExec(sqlQuery, structToInsert)

问题:如何使用tx.NamedExec()的返回结果获取最后插入的id?我尝试过datas.LastInsertId(),但它总是返回0。

注意:我确定向Postgres插入成功了。

2个回答

78
这是因为PostgreSQL不会返回最后插入的id。这是因为只有在向使用序列的表中创建新行时,最后插入的id才可用。
如果您实际上要在分配了序列的表中插入一行,则必须使用RETURNING子句,类似于这样:INSERT INTO table (name) VALUES("val") RETURNING id"
我不确定你的驱动程序,但在pq中,您需要以以下方式执行此操作:
lastInsertId := 0
err = db.QueryRow("INSERT INTO brands (name) VALUES($1) RETURNING id", name).Scan(&lastInsertId)

如果ID是在数据库内生成的UUID,那该怎么办? - TheRealChx101

7
resp.LastInsertID()通常只适用于mySQL,并且仅适用于整数ID:https://golang.org/pkg/database/sql/#Result 请注意,由于您正在使用sqlx(通过使用NamedExec),因此您需要改用tx.Get来执行查询并捕获返回值:
// id should match the type of your ID 
// e.g. int64 for a bigserial column, or string for a uuid
var id string
resp, err := tx.Get(&id, query, v1, v2, v3)

请参考sqlx GitHub存储库中的相关讨论:https://github.com/jmoiron/sqlx/issues/154#issuecomment-148216948

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接