2015-10-28 2 views
7

Io uso la libreria jmoiron/sqlx per comunicare con il mio server PostgreSql nelle mie app Go. Da qualche parte sulla mia app ho questo codice seguente:Vai: Come ottenere l'ultimo ID di inserimento su Postgresql con NamedExec()

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) 

Domanda: Come posso ottenere l'ultimo id inserto con il ritorno da tx.NamedExec()? Ho provato datas.LastInsertId() ma è sempre restituito 0.

Nota: sono sicuro che l'inserto di Postgres è successo.

risposta

9

la ri questo perché PostgreSQL non ti restituisce l'ultimo ID inserito. Questo perché l'ultimo ID inserito è disponibile solo se si crea una nuova riga in una tabella che utilizza una sequenza.

Se si inserisce effettivamente una riga nella tabella in cui è stata assegnata una sequenza, è necessario utilizzare RETURNING clause. Qualcosa del genere: INSERT INTO table (name) VALUES("val") RETURNING id".

io non sono sicuro circa il driver, ma in pq si farà questo nel modo seguente:

lastInsertId := 0 
err = db.QueryRow("INSERT INTO brands (name) VALUES($1) RETURNING id", name).Scan(&lastInsertId) 
4

resp.LastInsertID() solo (in genere) funziona con mySQL, e funziona solo per gli ID interi: https://golang.org/pkg/database/sql/#Result

Nota che, dal momento che si sta utilizzando sqlx (mediante l'uso di NamedExec) si vorrà utilizzare invece tx.Get a exec la query e catturare il valore di ritorno:

// 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) 

Vai a questa discussione pertinenti sul sqlx GitHub repo: https://github.com/jmoiron/sqlx/issues/154#issuecomment-148216948

Problemi correlati