如何在没有ORM的情况下使用SQLAlchemy查询从表中删除行?

Posted

tags:

篇首语:本文由小常识网(cha138.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时,我非常环保,我该怎么做呢?

答案

通过一些代码,我做了类似的事情,我相信这会做你想要的。

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

在表对象上调用delete()会为您提供sql.expression(如果内存服务),然后执行。我假设上面的表绑定了一个连接,这意味着你可以在它上面调用execute()。如果没有,你可以在连接上将d传递给execute(d)

请参阅docs here

另一答案

从查询对象调用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)

以上是关于如何在没有ORM的情况下使用SQLAlchemy查询从表中删除行?的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy-ORM

SQLAlchemy 创建 增 删 改 查

如何将 Sqlalchemy ORM 查询结果转换为包含关系的单个联接表?

如何在 SQLAlchemy 中执行自定义连接

如何在不创建 django 项目的情况下使用 Django 1.8.5 ORM?

mysql八:ORM框架SQLAlchemy