2011-12-21 9 views
13

Używam SQLAlchemy bez ORM, tj. Za pomocą ręcznie wykonanych statuetów SQL, aby bezpośrednio współpracować z dbowym zapleczem. Używam PG jako mojego zaplecza db (psycopg2 jako sterownik DB) w tym przypadku - nie wiem, czy to wpływa na odpowiedź.SqlAlchemy: pobieranie identyfikatora ostatniego wstawionego rekordu

mam sprawozdań tak (dla uproszczenia przyjmijmy, że Conn jest poprawnym połączenie db):

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

Załóżmy również, że tabela użytkownik składa się z kolumn (id [SERIAL PRIMARY KEY] nazwa, country_id)

Jak mogę uzyskać identyfikator nowego użytkownika (najlepiej bez ponownie trafiając db?)

+0

Co to ma wspólnego z SQLAlchemy? –

Odpowiedz

14

Możesz być w stanie korzystać z klauzuli RETURNING z INSERT statement tak:

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

Jeśli chcesz tylko uzyskany id:

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

Zdecydowanie potrzebowałem. Zwrócony obiekt był ResultProxy w obu przypadkach, więc musiałem trochę zmodyfikować kod (przez wywołanie fetchone()), aby go uruchomić. –

+7

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

+0

To rozwiązanie nie działa z 'sqlite'. Powoduje to 'sqlalchemy.exc.CompileError: RETURNING nie jest obsługiwany przez ten kompilator instrukcji". Inne rozwiązanie ("lastrowid") działa w tym przypadku. –

13

użytkownika lastrowid

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

To nie działa z PG db przy użyciu sterownika psycopg2. –

+0

Niestety nie mam pgsql na moim biurku użyłem mysql :) – Nilesh

+6

Dokładniej, to nie działa z tabelami bez OID, który jest obecnie domyślny. W każdym razie często nie jest to poszukiwany oid: ZWROT jest lepszym rozwiązaniem. – piro

0

Aktualny SQLAlchemy documentation sugeruje

result.inserted_primary_key powinno działać!