2011-12-21 123 views
13

我在沒有ORM的情況下使用SQLAlchemy,即使用手工製作的SQL statememts直接與後端數據庫進行交互。我在本例中使用PG作爲後端數據庫(psycopg2作爲數據庫驅動程序) - 我不知道這是否會影響答案。SqlAlchemy:獲取插入的最後一條記錄的ID

我有這樣的語句(爲了簡潔起見,假定conn是的分貝的有效連接):

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

假設還使得用戶表由連接柱(ID [SERIAL PRIMARY KEY]名,COUNTRY_ID)

我如何可以獲取新用戶(理想的ID,而無需再次擊中分貝?)

+0

這與SQLAlchemy有什麼關係? – 2014-11-19 20:33:14

回答

14

您可能能夠使用RETURNING子句INSERT statement這樣的:

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

如果你只想要得到的id

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

絕對是我需要的。在這兩種情況下,返回的對象都是ResultProxy,所以我不得不稍微修改一下代碼(通過調用fetchone())來使其運行。 – 2011-12-21 14:12:51

+7

或者,'user.insert()。returns(user.c.id).values({'name':'Homer','country_id':123})' – Pakman 2013-04-25 19:15:17

+0

此解決方案不適用於'sqlite'。它會導致sqlalchemy.exc.CompileError:這個方言的語句編譯器不支持RETURNING。另一種解決方案('lastrowid')適用於這種情況。 – 2017-11-30 01:33:45

13

用戶lastrowid

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

這不適用於使用psycopg2驅動程序的PG數據庫。 – 2011-12-21 13:38:11

+0

對不起,我沒有pgsql在我的辦公桌我用mysql :) – Nilesh 2011-12-22 05:14:20

+6

更具體地說,它不適用於表沒有oid,這是目前的默認。無論如何,它通常不是你正在尋找的oid:RETURNING是一種出衆的解決方案。 – piro 2012-01-03 23:56:33

0

當前的SQLAlchemy documentation建議

result.inserted_primary_key應該管用!