【问题标题】:Get id where all rows are true (sqalchemy)获取所有行都为真的 id (sqlalchemy)
【发布时间】:2021-05-08 19:36:12
【问题描述】:

我正在尝试找到一种简单的方法来查找一个或多个带有form_id 的所有项目都处于活动状态的特定表单。

这是我的Messages 表:

class Messages(db.Model):
    __tablename__ = 'Messages'
    id = db.Column(db.Integer, primary_key=True, unique=True, autoincrement=True)
    form_id = db.Column(db.String(12), index=True)
    message_text = db.Column(db.String(1000), nullable=True, unique=False, index=True)
    active = db.Column(db.Boolean, unique=False, index=False, nullable=True, default=False)

有问题的表单有多个字段,每个字段都是一条单独的消息。整个表单有一个唯一的form_id。 我想查询数据库并获取form_id,但仅适用于带有form_id所有 消息将active 设置为True 的表单。

类似:

alert_form_id = db.session.query(Messages.form_id).filter_by(active=True).first()

但这会返回所有 form_id,即使单个消息具有 active=True

有没有一种简单的方法可以用 sqalchemy 做到这一点,还是我需要检查每个 form_id 的项目数与“活动”项目数?

【问题讨论】:

  • 语法不是message = db.session.query(Messages).filter_by(active=True).first() 没有.form_id?。你得到一个消息对象,然后调用message.form_id。我现在无法测试。
  • 我认为既然您使用的是 flask_sqlalchemy,您应该使用以下内容。 alert_form_id = Messages.query.with_entities(Messages.form_id).filter_by(active=True).first()
  • 您使用的是哪个 DBMS?例如 PostgreSQL 有 every / bool_and 聚合。如果不支持,您可以使用 FORALL ( p ) -> NOT EXISTS ( NOT p ) 的事实。
  • @IljaEverilä 我目前正在使用 SQLite,但我一直在迁移到 PostgreSQL。
  • @MaiconMauricio 我不确定有什么不同。是的,我可以获取消息对象,然后执行message.form_id,但由于我实际上只需要form_id,我可以直接使用query(Messages.form_id) 调用它。无论哪种方式都会产生相同的结果,我不确定是否有任何区别从性能的角度来看。

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案1】:

根据确切的要求和模型/关系定义,有更简洁的方法来实现它。但以下内容应该适用于您共享的模型。这个想法是计算消息总数与每个表单的活动消息数相同(不留下非活动消息):

q = (
    session.query(Message.form_id).group_by(Message.form_id)
    .having(func.sum(case([(Message.active == True, 1)], else_=0)) == func.count(Message.id))
)

替代解决方案: 找到那些 (distinct) form_id 值,其中没有 inactive 消息:

M2 = aliased(Message)
q = session.query(Message.form_id.distinct()).filter(
    ~session.query(M2)
    .filter(Message.form_id == M2.form_id)
    .filter(M2.active == False)
    .exists()
)

【讨论】:

  • 简洁便携!我只是认为他们在active = TRUE :)
  • 谢谢你,@IljaEverilä。更正了答案以反映您的评论,这是正确的。
  • 这太棒了!我正在使用第一个解决方案,但我只是注意到您添加了替代方案。您是否会说替代解决方案会更快,因为它不计算每个条目?
  • 我认为性能差异将取决于表的大小、每个 form_id 的条目数和索引。我会说更多的是品味问题
猜你喜欢
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 2012-10-12
  • 1970-01-01
  • 2020-06-24
  • 2022-11-25
  • 1970-01-01
相关资源
最近更新 更多