【问题标题】:SQLAlchemy: Using delete/update with a join querySQLAlchemy:将删除/更新与连接查询一起使用
【发布时间】:2015-11-11 14:05:28
【问题描述】:

使用 Flask-SQLAlchemy,我想根据另一个表的值删除表 Questions 中的行,该表链接到表 Topic,然后使用外键链接到表 Subject。我试过这个查询:

db.session.query(Questions).join(Topic)join(Subject).filter(Subject.account_id==current_user.id).delete()

但是,我收到一个错误:

InvalidRequestError: Can't call Query.update() or Query.delete() when join(), outerjoin(), select_from(), or from_self() has been called

因此,我想我不能将.delete().join() 一起使用

是否有解决此问题的方法?谢谢。

【问题讨论】:

    标签: python database flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您不必为查询使用联接,您可以以某种方式完成它

    db.session.query(Post).filter(Post.user_id==current_user.id).delete()
    

    假设您的帖子有一个 user_id 列。

    Join 表不知道要删除哪个表,Post 或 User,因为它实际上构建了一个复杂的中间表,并从中进行查询。

    【讨论】:

    • 有没有办法做到这一点而不参考帖子中的user_id 列?我使用的示例只是我实际问题的常见类比。
    • 如何将 Post 与 User 联系起来,Post 不应该有一个提到 User 的列吗?
    • 我已经更新了这个问题以适应我的问题,我想我不是很清楚抱歉。想要删除链接到主题行的每个问题,该行链接到主题中具有匹配 account_id 的行。
    【解决方案2】:

    基于Update joined table via SQLAlchemy ORM using session.query 中的类似讨论,如果您使用 ORM 而不是 Core,我能够找到一种解决方法。将连接拆分成一个单独的 cte/子查询,它会返回您要更新的行的 ID。

    question_joins = db.session.query(Question).join(Topic)join(Subject)
    question_filter  = question_joins.filter(Subject.account_id==current_user.id)
    question_id_subquery = question_filter.with_entities(Question.id).subquery()
    
    db.session.query(Question).filter(Question.id.in_(question_id_subquery)).delete()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-24
      • 2017-08-08
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 2019-06-03
      相关资源
      最近更新 更多