我使用的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”,它似乎不是正确的锁定类型?
答案 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))