2011-12-21 23 views
13

eklenen son kaydın kimliğini alma Ben ORM olmadan SQLAlchemy kullanıyorum, yani arka plan db ile doğrudan etkileşim için el yapımı SQL deyimlerini kullanarak. Bu örnekte PG'yi backend db (DB sürücüsü olarak psycopg2) olarak kullanıyorum - bunun cevabı etkileyip etkilemediğini bilmiyorum. Kullanıcı tablo (id [SERİ PRIMARY KEY] sütunlardan oluştuğuSqlAlchemy:

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

da varsayalım:

I (kısalık için, o bağl db için geçerli bir bağlantı olduğunu varsayalım) böyle ifadeler var ad, country_id) tekrar db vurmadan, ideal olarak yeni kullanıcı (id temin edebilirler nasıl

?)

+0

Bunun SQLAlchemy ile ne ilgisi var? –

cevap

14

Böyle INSERT statement ait RETURNING maddesini kullanmak mümkün olabilir:

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

Kesinlikle ihtiyacım olan şey. İade edilen nesne, her iki durumda da bir ResultProxy idi, bu yüzden işe geçmek için kodu biraz değiştirmek zorunda kaldım (fetchone() ile). –

+7

Alternatif olarak, 'user.insert(). Dönen (user.c.id) .values ​​({' name ':' Homer ',' country_id ': 123}) ' – Pakman

+0

Bu çözüm' sqlite' ile çalışmaz. Sqlalchemy.exc.CompileError sonucunu verir: RETURNING bu diyalektin deyim derleyicisi tarafından desteklenmez. Diğer çözüm (lastrowid) bu durumda çalışır. –

13

Kullanıcı lastrowid

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

Bu, bir psycopg2 sürücüsü kullanarak PG db ile çalışmaz. –

+0

Üzgünüm, masamda pgsql kullanmıyorum mysql kullanıyorum :) – Nilesh

+6

Daha özel olarak, o anda varsayılan olan oid olmayan tablolarla çalışmaz. Ve her neyse, genellikle aradığınız oid değil: RETURNING, üstün bir çözüm yolu. – piro

0

Güncel SQLAlchemy documentation

result.inserted_primary_key önerir: Yalnızca id çıkan istiyorsanız

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

çalışmalı!