2011-12-21 7 views
13

Sto utilizzando SQLAlchemy senza ORM, ad esempio utilizzando statemem SQL creati a mano per interagire direttamente con il db back-end. Sto usando PG come mio backend db (psycopg2 come driver DB) in questo caso - non so se questo influisce sulla risposta.SqlAlchemy: acquisizione dell'ID dell'ultimo record inserito

devo dichiarazioni come questo (per brevità, si supponga che conn è una connessione valida al db):

conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123)") 

supponga inoltre che la tabella utente consiste delle colonne (id [PRIMARY KEY SERIAL], nome, country_id)

Come posso ottenere l'ID del nuovo utente (idealmente, senza colpire di nuovo il db?)

+0

Che cosa ha a che fare questo con SQLAlchemy? –

risposta

14

Potreste essere in grado di utilizzare la clausola RETURNING del INSERT statement in questo modo:

result = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123) 
         RETURNING *") 

Se si desidera solo la risultante id:

rslt_id = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123) 
         RETURNING id") 
+1

Decisamente ciò di cui avevo bisogno. L'oggetto restituito era un ResultProxy in entrambi i casi, quindi ho dovuto modificare il codice un po '(chiamando fetchone()) per farlo funzionare. –

+7

In alternativa, 'user.insert(). Return (user.c.id) .values ​​({'name': 'Homer', 'country_id': 123})' – Pakman

+0

Questa soluzione non funziona con 'sqlite'. Risulta in 'sqlalchemy.exc.CompileError: RETURNING non è supportato dal compilatore di istruzioni di questo dialetto. L'altra soluzione ('lastrowid') funziona in quel caso. –

13

utente lastrowid

result = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123)") 
result.lastrowid 
+3

Questo non funziona con PG db utilizzando un driver psycopg2. –

+0

Scusa se non ho pgsql alla mia scrivania ho usato mysql :) – Nilesh

+6

Più in particolare, non funziona con le tabelle senza oid, che è attualmente l'impostazione predefinita. E comunque spesso non è l'oid che stai cercando: RITORNARE è una soluzione decisamente superiore. – piro

0

attuale SQLAlchemy documentation suggerisce

result.inserted_primary_key dovrebbe funzionare!