2016-10-04 1 views
0

Ich schreibe einen kleinen Web-Service in Go, die Postgres durch die pq driver package verwendet.Gehen Sie mit Postgres: LastInsertedId für nicht sequentielle Bezeichner

Ich benutze einen UUID als Identifikator für meine Modelle, damit LastInsertId nicht funktioniert.

So bin ich denke, ich so etwas wie dies könnte:

var id string 
    res, err := session.Exec("INSERT INTO todos (text, list_id) VALUES ($1, $2) RETURNING todo_id", text, listId).Scan(&id) 

Scan scheint gut mit Exec zu spielen.

Wie kann ich die Uuid aus meiner neuen todo Zeile zurückgeben?

Antwort

3

Von https://godoc.org/github.com/lib/pq#hdr-Queries sieht es aus wie Sie queryRow statt Exec

pq unterstützen nicht die lastInsertId() -Methode des Ergebnistypen in der Datenbank/SQL verwenden sollten. Zurückzukehren, um die Kennung eines INSERT (oder UPDATE oder DELETE), verwenden Sie die Postgres RETURNING-Klausel mit einer Standardabfrage oder queryRow Aufruf:

var userid int 
err := db.QueryRow(`INSERT INTO users(name, favorite_fruit, age) 
    VALUES('beatrice', 'starfruit', 93) RETURNING id`).Scan(&userid) 
+0

las ich an anderer Stelle, dass Exec wurde für alle Insert/Update-Transaktionen empfohlen, aber diese eigentlich scheint zu arbeiten, also danke. – marsrover

+0

@marsrover yeah normalerweise würden Sie Exec verwenden, aber postgres plus 'RETURNING' ist gerade speziell. Es freut mich, dass ich helfen konnte. – jcbwlkr

Verwandte Themen