sqlalchemy FOR UPDATE NOWAIT
sqlalchemy的文档提到,从PostgreSQL 8.1版本开始,你可以通过Query.with_lockmode('update_nowait')来指定“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 个回答
2
在较新版本的sqlalchemy中,你可以使用
session.query().with_for_update(of=[fields to update], nowait=True)
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()这个默认的查询渲染器生成的查询和实际发送到数据库的查询是不一样的。我怀疑在你的情况下,SQLAlchemy在Postgres上也会这样表现——打印q会生成一个与数据库方言无关的查询。
另外,renderquery()方法的实现可以在这里找到。