Фильтр по интервалу dateTime в SQLAlchemy следующий запрос - PullRequest
0 голосов
/ 13 июня 2019

Я создал API фляги, который подключен к базе данных Postgres, я я пытаюсь создать маршрут, который даст мне исторические данные из базы данных, чтобы я мог получить 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 дней.

Это то, что я пытался сделать с SQLAlchemy в python, используя datetime:

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) 

historyDetailedInformationJson - это просто шаблон 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

Если кто-нибудь может помочь мне прояснить проблему, я был бы очень признателен. Спасибо.

1 Ответ

0 голосов
/ 13 июня 2019

statusInformation.query.filter(statusInformation.dateTime >= seven_days_ago) приведет к Query объекту , вы можете постепенно создавать запрос с фильтрами и т. Д., Но вам нужно указать форму, которую будут принимать результаты, чтобы фактически выполнить запрос.

например. (при условии, что statusInformation является моделью ORM SQLAlchemy), если historicData является вашим объектом запроса, то historicData.all() вернет строки, возвращаемые запросом, в виде списка объектов. Если вы ожидаете только один результат, historicData.one() вернет один объект и вызовет исключение, если в результатах запроса фактически было более одной строки.

Если вы проверяете документацию по запросу , существуют другие методы, которые разрешают запросы другими способами (например, one_or_none(), count()).

...