web-dev-qa-db-ja.com

ORMなしでSQLAlchemyクエリを使用してテーブルから行を削除する方法は?

私はいくつかの行を削除するために迅速で汚いメンテナンススクリプトを書いていますが、メインプロジェクトからORMクラス/マッピングを持ち込む必要はありません。次のようなクエリがあります。

_address_table = Table('address',metadata,autoload=True)
addresses = session.query(addresses_table).filter(addresses_table.c.retired == 1)
_

私が読んだすべてのものによれば、ORMを使用して(「単なる」テーブルではなく)、次のようなものを渡した場合:

_addresses = session.query(Addresses).filter(addresses_table.c.retired == 1)
_

クエリに.delete()を追加できましたが、テーブルのみを使用してこれを実行しようとすると、苦情が出ます。

_File "/usr/local/lib/python2.6/dist-packages/sqlalchemy/orm/query.py", line 2146, in delete
    target_cls = self._mapper_zero().class_
AttributeError: 'NoneType' object has no attribute 'class_'
_

これはクラスではなくテーブルとして理にかなっています。 SQLAlchemyに関してはかなり環境に優しいのですが、どうすればよいでしょうか?

32
John Carter

私が似たようなことをしたコードを見てみると、これはあなたが望むことをするだろうと信じています。

_d = addresses_table.delete().where(addresses_table.c.retired == 1)
d.execute()
_

テーブルオブジェクトでdelete()を呼び出すと、_sql.expression_(メモリが提供される場合)が得られ、それを実行します。上記では、テーブルは接続にバインドされていると仮定しました。つまり、execute()を呼び出すことができます。そうでない場合は、接続のdexecute(d)に渡すことができます。

Docs here を参照してください。

38
rob

クエリオブジェクトからdelete()を呼び出すと、SQLAlchemyは一括削除を実行します。また、セッションから一致したオブジェクトを削除するための戦略を選択する必要があります。ドキュメントを参照してください here

セッションから一致するオブジェクトを削除するための戦略を選択しない場合、SQLAlchemyは、セッション内のオブジェクトに対してPythonストレートでクエリの基準を評価しようとします。基準の評価が実装されていない場合、エラーが発生します。

これが削除で発生していることです。

レコードを削除するだけで、削除後のセッションのレコードを気にしない場合は、セッションの同期を無視する戦略を選択できます。

address_table = Table('address', metadata, autoload=True)
addresses = session.query(address_table).filter(address_table.c.retired == 1)
addresses.delete(synchronize_session=False)
25
Carlo Pires