sqlalchemy FOR UPDATE NOWAIT

时间:2013-01-23 03:10:23

标签: python postgresql sqlalchemy select-for-update

sqlalchemy的documentation表示您可以使用Query.with_lockmode('update_nowait')在PostgreSQL 8.1中指定“FOR UPDATE NOWAIT”。有谁知道如何让它添加FOR UPDATE NOWAIT而不仅仅是FOR UPDATE?

PostgreSQL 9.1.6

query = db.session.query(MyTable)\
    .filter_by(process_status="PENDING")\
    .order_by(MyTable.id)\
    .with_lockmode('update_nowait')\

print query

SQL:

SELECT 
MyTable.id AS MyTable_id
,MyTable.created_on AS MyTable_created_on
FROM MyTable 
WHERE MyTable.process_status = :process_status_1 
ORDER BY MyTable.id 
FOR UPDATE

2 个答案:

答案 0 :(得分:2)

我能够使用Oracle 11g和SQLAlchemy 0.8.0b2重现类似的情况。

db = create_engine('...',echo=True)
...
q = session.query(CauseCode.__table__).with_lockmode('update_nowait')
print q
>>>SELECT ... FROM cause_code FOR UPDATE
print renderquery(q)
>>>SELECT ... FROM cause_code FOR UPDATE NOWAIT
q.all()
>>>2013-01-23 09:58:12,665 INFO sqlalchemy.engine.base.Engine SELECT ... FROM cause_code FOR UPDATE NOWAIT

str ()使用的默认查询渲染器通常会生成与执行到DB的实际查询不同的查询。 我怀疑sqlalchemy在你的情况下对Postgres的行为方式相同 - print q产生方言不可知查询。

可以找到PS renderquery()方法实现here

答案 1 :(得分:1)

在较新版本的sqlalchmey中,您可以使用

session.query().with_for_update(of=[fields to update], nowait=True)