【问题标题】:Filter by dateTime interval in SQLAlchemy the following query在 SQLAlchemy 中按 dateTime 间隔过滤以下查询
【发布时间】:2019-10-27 20:04:29
【问题描述】:

我创建了一个连接到 Postgres 数据库的烧瓶 API,我 我正在尝试创建一条路线,该路线将为我提供数据库中的历史数据,以便我可以接收 json 以在前端(ReactJS)上显示为图表。

现在,我在 pgAdmin 上成功运行了以下查询:

SELECT humidity, temperature, "waterpumpState", "dateTime" from public."systemInformation"  where "systemInformation"."dateTime" > current_date - interval '7 days'

我用 SQLAlchemy 创建了这个数据库模型:

class statusInformation(db.Model):
    __tablename__ = 'systemInformation'
    id = db.Column(db.Integer, unique=True, primary_key=True)
    humidity = db.Column(db.Float, nullable=False)
    temperature = db.Column(db.Float, nullable=False)
    waterpumpState = db.Column(db.Boolean, nullable=False)
    clientOverride = db.Column(db.Boolean, nullable=False)
    humidityLevelSetting = db.Column((db.String(250)))
    dateTime = db.Column(db.TIMESTAMP, server_default=db.func.current_timestamp(), nullable=False)

从此表中,我想使用 SQLAlchemy 查询仅提取湿度、温度和日期时间。

我想获取从这一刻起不超过 7 天的所有条目,以便我可以将它们映射到我调用此路由时显示的 JSON,响应我想创建一个显示的 ReactJS 图表7 天内的湿度和温度水平。

这是我尝试在 python 中使用日期时间对 SQLAlchemy 进行的操作:

def get_historic_data():
        now = datetime.now()
        seven_days_ago = now - timedelta(days=7)
        historicData = statusInformation.query.filter(statusInformation.dateTime >= seven_days_ago)
        return statusInformation.historyDetailedInformationJson(historicData) 

historyDe​​tailedInformationJson 只是一个应该返回给我的 JSON 模板,它看起来像这样:

   def historyDetailedInformationJson(self):
        return{
            'humidity':self.humidity,
            'temperature':self.temperature,
            'waterpumpState':self.waterpumpState,
            'dateTime':self.dateTime
        }

这是我尝试从 get_historic_data 打印结果时得到的结果:

SELECT "systemInformation".id AS "systemInformation_id", "systemInformation".emInformation".temperature AS "systemInformation_temperature", "systemInformaterpumpState", "systemInformation"."clientOverride" AS "systemInformation_clilSetting" AS "systemInformation_humidityLevelSetting", "systemInformation"."d
FROM "systemInformation"
WHERE "systemInformation"."dateTime" >= %(dateTime_1)s

如果有人能帮我澄清问题,我将不胜感激。 谢谢。

【问题讨论】:

    标签: python json postgresql sqlalchemy flask-sqlalchemy


    【解决方案1】:

    statusInformation.query.filter(statusInformation.dateTime >= seven_days_ago) 将产生Query object,您可以使用过滤器等增量构建查询,但您需要指定实际执行查询的结果形式。

    例如(假设statusInformation 是一个SQLAlchemy ORM 模型)如果historicData 是您的查询对象,那么historicData.all() 将返回查询返回的行作为对象列表。如果您只期望一个结果,historicData.one() 将返回一个对象并在查询结果中实际存在多行时引发异常。

    如果您检查query docs,还有其他方法可以以其他方式解析查询(例如one_or_none()、count())。

    【讨论】:

    • 您好,感谢您的回答。我在查询末尾添加了 .all() ,因为我想要 7 天间隔内的所有条目。但我不知道如何获取该数据并返回/打印它,以便我可以看到它的值或格式。当我尝试返回值时,我得到:TypeError: 'BaseQuery' object is not callable。
    • 好的,很酷 - 你能在帖子中添加更多上下文吗?看看 statusInformation 是什么以及你现在想用 .all() 做什么会很有帮助
    • 我已经更新了上下文,但我也会写在这里。 statusInformation 是我的表格,其中包含湿度、温度、waterpumpState 和 dateTime。我想在 React 中创建一个图表,以便我可以显示 7 天内的湿度和温度。所以,我想获取所有 7 天以下的行,将查询的响应映射到 json,最后将其作为对 api 路由的响应发送。我遇到的问题是从行中获取数据,因为我可能写错了查询并将其映射到 json。希望现在已经足够清楚了。
    • 假设historyDetailedInformationJson 是statusInformation 上的一个方法,你可以试试:return [status_info.historyDetailedInformationJson() for status_info in statusInformation.query.filter(statusInformation.dateTime >= seven_days_ago).all()],我希望它返回一个包含你想要的属性的字典列表
    • 我尝试过使用默认的 historyDe​​tailedJson,我得到了这个:TypeError: 'list' object is not callable。我也尝试过修改 json 格式,以便我将其定义为:def historyDetailedInformationJson(self): return{ [ { 'humidity':self.humidity, 'temperature':self.temperature, 'waterpumpState':self.waterpumpState, 'dateTime':self.dateTime } ] },但它仍然无法告诉我 'dict' 是不可散列的
    猜你喜欢
    • 2018-12-29
    • 2016-04-23
    • 2023-03-30
    • 1970-01-01
    • 2020-08-25
    • 2018-08-09
    • 2015-01-15
    • 2011-11-27
    相关资源
    最近更新 更多