2

sqlalchemy的文档说您可以使用 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
4

2 回答 2

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() 方法实现可以在这里找到

于 2013-01-23T15:36:25.320 回答
2

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

session.query().with_for_update(of=[fields to update], nowait=True)
于 2018-09-13T00:37:23.240 回答