当前位置: 首页 > 面试题库 >

SQLAlchemy删除子查询

穆子琪
2023-03-14
问题内容

我试图使用没有结果的过滤查询删除一些子行:

sl = DBSession.query(Puesto.id).filter(Puesto.locales_id == id).subquery()
DBSession.query(Servicio).filter(Servicio.puestos_id.in_(sl)).delete()

我得到InvalidRequestError: Could not evaluate current criteria in Python. Specify 'fetch' or False for the synchronize_session parameter.了错误。

全栈跟踪:

Traceback (most recent call last):
  File "/usr/src/tg2env/ceaf/ceaf/controllers/root.py", line 1673, in delete_local
    DBSession.query(Servicio).filter(Servicio.puestos_id.in_(sl)).delete()
  File "/usr/src/tg2env/lib/python2.4/site-packages/SQLAlchemy-0.6.6-py2.4.egg/sqlalchemy/orm/query.py", line 2126, in delete
    raise sa_exc.InvalidRequestError(
InvalidRequestError: Could not evaluate current criteria in Python.  Specify 'fetch' or False for the synchronize_session parameter.

我无法找到问题所在。

任何想法?

问候


问题答案:

在查找您的异常发生的源之后,我建议尝试以下操作:

sl = DBSession.query(Puesto.id).filter(Puesto.locales_id == id).subquery()
DBSession.query(Servicio).filter(Servicio.puestos_id.in_(sl)) \
.delete(synchronize_session='fetch')

请参阅delete方法的文档以了解其含义。传递fetch参数将基本上运行查询两次,一次为选择,一次为删除。

如果运行两个查询是不希望的,通过synchronize_session=False代替,然后调用session.expire_all()立即删除后,以避免不一致的状态的内部MetaData存储。



 类似资料:
  • 问题内容: 我必须缺少SQLAlchemy的层叠选项的琐碎内容,因为我无法获得简单的层叠删除来正确操作-如果删除了父元素,则子对象将使用外键保留。 我在这里放了一个简洁的测试用例: 输出: 父母与子女之间存在简单的一对多关系。该脚本创建一个父级,添加3个子级,然后提交。接下来,它删除父级,但子级仍然存在。为什么?如何使孩子级联删除? 问题答案: 问题是sqlalchemy认为是父级的,因为这是您定

  • 问题内容: 我试图做一个函数来删除我的数据库中带有flask和SQLAlchemy扩展名的记录。问题是,它不仅删除了所有行,而且还删除了所有行。有人可以告诉我我的代码有什么问题吗? 提前致谢! 问题答案: 我怀疑这条线与你的想法不符。 你将获得一个实例(你之前已经做过),并且通过使用它实际上对所有对象发出了一个新查询,而不进行过滤,因此删除了所有对象。 你可能想做的是:

  • 问题内容: 我的模型与模型有关系。我已指定该关系应级联删除操作。但是,当我查询和删除用户时,出现一个错误,指出仍在引用地址行。如何删除用户和地址? 问题答案: 你有以下… 请注意,在“过滤器”之后,您仍然返回Query对象。因此,当您调用时,您正在调用Query对象(而不是User对象)。这意味着您正在执行批量删除(尽管可能只删除了一行) 您正在使用的方法的文档说… 该方法不提供Python中的级

  • 问题内容: 我最近才刚开始使用SQLAlchemy,但仍无法解决某些概念。 归结为基本元素,我有两个这样的表(通过Flask-SQLAlchemy): 我将如何查询用户列表及其最新帖子(不包括无帖子的用户)。如果我使用的是SQL,则可以执行以下操作: 因此,我确切地知道“期望的” SQL可以达到我想要的效果,但是不知道如何在SQLAlchemy中“正确地”表达它。 编辑:如果很重要,我使用的是SQ

  • 问题内容: 我想使用SQLAlchemy删除表。 由于我要一遍又一遍地进行测试,因此我想删除该表,以便每次都可以从头开始。 到目前为止,我正在使用SQLAlchemy通过engine.execute()方法执行原始SQL : 但是,我想知道是否有一些标准方法可以做到这一点。我能找到的唯一一个是,但是它删除了所有结构,而不仅删除了一个特定的表: 例如,给出这个非常基本的例子。它由一个带有单个表的SQ

  • 问题内容: 我正在尝试将SQL转换为SQLAlchemy。我要查询的SQL版本如下: 我的SQLAlchemy查询如下: 我收到一个错误 如果我将SQLAlchemy查询调整为以下内容: 结果= query.all() 我得到一个错误 任何帮助,将不胜感激,谢谢! 问题答案: 一旦调用,就无法访​​问 对象 ,而只能通过访问器访问列。 而是执行以下操作:仅加载所需的列,以避免任何名称冲突: 然后在