获取所有行都为真的 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()
)
我正在尝试找到一种简单的方法来查找一个或多个具有 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()
)