【问题标题】:Delete rows in database where id not found in a filtered query in Flask-SQLAlchemy删除数据库中在 Flask-SQLAlchemy 的过滤查询中找不到 id 的行
【发布时间】:2021-09-26 04:33:47
【问题描述】:

我想从过滤的查询中删除我的数据库中未在 ID 中找到 ID 的行。用外行的话来说,“如果行的 ID 不在来自按名称保留唯一用户的查询的 ID 中,则删除行”。

例如,我想清除数据库中重复名称的用户:

from project.models import db, User

query = User.query.group_by(User.name)
User.query.filter(** filter out User.id not found in `query.id` **).delete()
db.session.commit()

【问题讨论】:

    标签: python python-3.x flask sqlalchemy


    【解决方案1】:

    您可以在同一个查询对象上多次调用过滤器。

    query = User.query.group_by(User.name).all()
    delete_query = db.session.query()
    for user in query:
        delete_query = delete_query.filter(User.id != user.id)
    delete_query.delete()
    db.session.commit()
    

    【讨论】:

    • 请注意,除非在某些条件下,否则不会执行查询,因此这样做只会执行一个查询。
    【解决方案2】:

    好吧,经过一番挖掘,我找到了一个可行的解决方案:

    from project.models import db, User
    
    # Filter id's where `User.name` is unique
    query = User.query.with_entities(User.id).group_by(User.name)
    del_query = User.__table__.delete().where(User.id.not_in(query))
    
    # Delete posts with non-unique names
    db.session.execute(del_query)
    db.session.commit()
    

    此解决方案不使用User.query.group_by(User.name).all() 进行迭代过滤,如果您的数据库很大,这可能会引入时间和内存问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 2021-11-24
      相关资源
      最近更新 更多