5

SqlAlchemy を使用すると、最初に一致した行のみを更新するクエリを作成できますか?

私の場合、最新のログ エントリを更新する必要があります。

class Log(Base):
    __tablename__ = 'logs'
    id = Column(Integer, primary_key=True)
    #...
    analyzed = Column(Boolean)

session.query(Log)  \
    .order_by(Log.id.desc())  \
    .limit(1)  \
    .update({ 'analyzed': True })

結果は次のようになります。

InvalidRequestError: limit() が呼び出されたときに Query.update() を呼び出せません

UPDATE ... LIMIT 1これはMySQL のみの機能であるため、理にかなっています (解決策はこちら) 。

しかし、PostgreSQL で同じことを行うにはどうすればよいでしょうか? おそらく、サブクエリアプローチを使用していますか?

4

3 に答える 3

8

サブクエリ レシピはそれを行うための正しい方法です。このクエリを作成する必要があるのは、SqlAlchemy だけです。

サブクエリから始めましょう。

sq = ssn.query(Log.id)  \
    .order_by(Log.id.desc())  \
    .limit(1)  \
    .with_for_update()

そして今、 update() docs の例でas_scalar()でそれを使用します:

from sqlalchemy import update

q = update(Log)  \
    .values({'analyzed': True})  \
    .where(Log.id == sq.as_scalar())

クエリを印刷して結果を確認します。

UPDATE logs 
SET analyzed=:analyzed 
WHERE logs.id = (
    SELECT logs.id 
    FROM logs ORDER BY logs.id DESC 
    LIMIT :param_1 
    FOR UPDATE
)

楽しみ!

于 2014-09-19T23:27:33.997 に答える