我在我的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是成功的。
答案 0 :(得分:16)
原因是因为PostgreSQL没有返回最后插入的id。这是因为只有在使用序列的表中创建新行时,最后插入的ID才可用。
如果您实际在分配序列的表中插入一行,则必须使用RETURNING
clause。这样的事情: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)
答案 1 :(得分:5)
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