为什么我的flask-sqlalchemy删除查询失败

时间:2018-04-12 11:04:17

标签: python sqlalchemy flask-sqlalchemy

我有一个使用flask-sqlalchemy的查询,其中我想从数据库中删除所有股票,其中股票代码与列表中的一个匹配。这是我当前的查询:

Stock.query.filter(Stock.ticker.in_(new_tickers)).delete()

其中new_tickersstr个有效代码的列表。

我得到的错误如下:

sqlalchemy.exc.InvalidRequestError: Could not evaluate current criteria in Python: "Cannot evaluate clauselist with operator <function comma_op at 0x1104e4730>". Specify 'fetch' or False for the synchronize_session parameter.

2 个答案:

答案 0 :(得分:3)

我来这里是为了寻找这个问题的答案(这是Google的第一个热门)。 @ScottLee的答案将我引向正确的信息。他的解决方案是一个选择,但后果没有解释。

基本上,当您发出各种SQLAlchemy方法时,SQLAlchemy会在Python中维护会话。删除条目时,SQLAlchemy将如何从会话中删除所有已删除的行?这由删除方法的参数“ synchronize_session”控制。 syncnize_session有三种可能:

  • “评估” :它直接在Python中评估产生的查询,以确定需要从会话中删除的对象。这是默认设置,非常有效,但是不够鲁棒,无法评估复杂的查询。如果无法评估查询,则会引发sqlalchemy.orm.evaluator。 UnevaluatableError 条件
  • “获取” :这将在删除之前执行选择查询,并使用该结果来确定需要删除会话中的哪些对象。这样效率较低(可能效率较低),但能够处理任何有效的查询
  • 错误:这不会尝试更新会话,因此非常有效,但是,如果删除后继续使用该会话,则可能会得到不正确的结果。

您使用哪个选项在很大程度上取决于代码如何使用会话。在大多数只需要根据复杂查询删除行的简单查询中, False 应该可以正常工作。 (问题中的示例适合这种情况)

SQLAlchemy Delete Method Reference

答案 1 :(得分:-2)

尝试使用以下代码:

Stock.query.filter(Stock.ticker.in_(new_tickers)).delete(synchronize_session=False)

https://docs.sqlalchemy.org/en/latest/orm/query.html?highlight=delete#sqlalchemy.orm.query.Query.delete