web-dev-qa-db-ja.com

Go:NamedExec()を使用してPostgresqlの最後の挿入IDを取得する方法

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への挿入が成功していることを確認してください。

21
Wendy Adi

これは、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)
20
Salvador Dali

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

5
elithrar