【发布时间】: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