2

sqlalchemyのドキュメントには、PostgreSQL 8.1 以降では Query.with_lockmode('update_nowait') を使用して「FOR UPDATE NOWAIT」を指定できると記載されています。FOR UPDATE だけでなく FOR UPDATE NOWAIT を追加する方法を知っている人はいますか?

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 に答える