获取所有行都为真的 id (sqlalchemy)

Get id where all rows are true (sqalchemy)

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

这是我的 Messages table:

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()

但是这个 returns 全部 form_id 即使一条消息有 active=True.

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

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

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 值,其中没有 不活跃 消息:

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()
)