GoアプリでPostgreSqlサーバーとの通信に jmoiron/sqlx ライブラリを使用しています。私のアプリのどこかに、次のコードがあります:
_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への挿入が成功していることを確認してください。
これは、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)
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