SqlAlchemy:使用`get或create`模式锁定表

时间:2011-05-22 22:15:32

标签: postgresql locking sqlalchemy

我使用的get_or_create模式类似于这个问题的答案:

Does SQLAlchemy have an equivalent of Django's get_or_create?

但我遇到另一个线程在第一个线程的'select'和'insert'之间创建一个实例(使用相同的pk)时出现问题。

get_or_create函数是否应锁定两个查询的表? 使用SqlAlchemy实现锁定的最佳方法是什么?

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

我能看到的唯一sqlalchemy锁定功能是“for update”,它似乎不是正确的锁定类型?

2 个答案:

答案 0 :(得分:2)

在另一个问题中,我似乎误解了你对我的回答的答复。

你在这里寻找的可能不是直接锁定,而是交易。 http://www.sqlalchemy.org/docs/core/connections.html#using-transactions

但是......你想阻止两次执行相同的插入吗?在这种情况下,您需要在python中的某个位置锁定(或捕获重复键错误)。这实际上是唯一可以做到这一点的万无一失的方法。如果出现重复键错误,请尝试插入并获取它。

答案 1 :(得分: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))