2011-05-22 33 views
3

我使用類似的回答這個問題一個get_or_create模式鎖定:的SQLAlchemy:表`獲取或create`模式

Does SQLAlchemy have an equivalent of Django's get_or_create?

但我有麻煩與另一個線程創建一個實例(使用相同的pk)在第一個線程的'select'和'insert'之間。

get_or_create函數應該鎖定兩個查詢的表嗎? 用SqlAlchemy實現鎖定的最佳方式是什麼?

我使用PostgreSQL:http://www.postgresql.org/docs/current/static/sql-lock.html

唯一SQLAlchemy的鎖定功能,我可以看到的是「for update」,這似乎並沒有被正確的類型鎖定的?

回答

2

看來我錯誤地理解了你在另一個問題中對我的回答的回覆。

你在這裏尋找的可能不是直接鎖定,而是交易。 http://www.sqlalchemy.org/docs/core/connections.html#using-transactions

但是...你是否試圖阻止執行相同的插入兩次?在這種情況下,你需要在python的某個地方使用鎖(或者捕獲重複鍵錯誤)。這實際上是唯一可以做到的萬無一失的方法。嘗試插入並獲取它,如果你得到一個重複的關鍵錯誤。

+0

對不起,我張貼之前,我看到我的評論回覆中的其他問題。 – EoghanM 2011-05-23 08:44:47

0

由於WoLpH,下面好像是爲我工作(EdgeInfo是靈丹妙藥模型):

from sqlalchemy import exc 

session.begin_nested() 
e_info = EdgeInfo(pk_attr_1=pk_attr_1, pk_attr_2=pk_attr_2) 
try: 
    session.commit() 
except exc.IntegrityError: 
    session.rollback() 
    e_info = EdgeInfo.get((pk_attr_1, pk_attr_2))