как использовать группу в flask sql алхимии - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть две таблицы

class MinMaxDim(db.Model):
   min_max_id = db.Column(db.Integer, primary_key=True)
   user_id = db.Column(db.Integer, nullable=False)
   room_id = db.Column(db.Integer, nullable=True)
   min_temp = db.Column(db.Integer, nullable=True)
   max_temp = db.Column(db.Integer, nullable=True)
   min_humidity = db.Column(db.Integer, nullable=True)
   max_humidity = db.Column(db.Integer, nullable=True)
   min_pressure = db.Column(db.Integer, nullable=True)
   max_pressure = db.Column(db.Integer, nullable=True)


class AvgDim(db.Model):
  avg_id = db.Column(db.Integer, primary_key=True)
  user_id = db.Column(db.Integer, nullable=False)
  room_id = db.Column(db.Integer, nullable=True)
  avg_temp = db.Column(db.Integer, nullable=True)
  avg_humidity = db.Column(db.Integer, nullable=True)
  avg_pressure = db.Column(db.Integer, nullable=True)

Требования:

  • Я пошлю room_id в качестве аргумента функции, она должна вернуть последние 7 дни min_temp, max_temp и avg_temp из двух таблиц.

Что я пробовал:

Я создал функцию, в которой я использовал group_by функция, но я получаю эту ошибку:

  (psycopg2.errors.GroupingError) column "min_max_dim.min_max_id" must appear in the GROUP BY clause 
   or be used in an aggregate function

Мой код :

     def get_weekly_dim_dataInfo(room_id):
        try:
           get_all_data = db.session.query(MinMaxDim).outerjoin(AvgDim, MinMaxDim.user_id ==
                           MinMaxDim.tenant_id).group_by(MinMaxDim.room_id).all()
           get_all_data_schema = MinMaxDimSchema(many=True).dump(get_all_data)
           get_all_avg_data_schema = AvgDimSchema(many=True).dump(get_all_data)
           print(get_all_data)
         except Exception as e:
             print(e)
             return False

1 Ответ

0 голосов
/ 26 апреля 2020

Не могли бы вы попробовать это:

get_all_data = db.session.query(MinMaxDim).outerjoin(AvgDim, MinMaxDim.user_id == MinMaxDim.tenant_id).group_by(MinMaxDim.min_max_id, MinMaxDim.room_id).all()

Как и следует из ошибки, вам нужно иметь min_max_id в предложении group by.

Любопытно, что вы можете реорганизовать ваши модели чтобы использовать преимущества postgresql агрегатных функций вместо попыток моделирования вокруг агрегированных результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...