Как я могу создать свойства column_properties, которые используют группу?

У меня есть этот sql-запрос:

select rooms.*, COUNT(DISTINCT(o.resident_id)) as resident_count, COUNT(reviews.id) as review_count, COUNT(photos.id) as photo_count, AVG(reviews.rating) as mean_review from t_rooms rooms JOIN t_room_listings listings on listings.room_id = rooms.id JOIN t_occupancies o on o.listing_id = listings.id LEFT JOIN t_reviews reviews on reviews.occupancy_id = o.id LEFT JOIN t_photos photos on photos.occupancy_id = o.id GROUP BY rooms.id 

Что я знаю, я могу написать в форме запроса ORM как:

 q = (session .query( Room, func.count(func.distinct(Occupancy.resident_id)).label('resident_count'), func.count(Review.id).label('review_count'), func.count(Photo.id).label('photo_count'), ( (3 + func.avg(Review.rating)) / (1 + func.count(Review.rating)) ).label('bayesian_rating') ) .select_from( join(Room, RoomListing).join(Occupancy).outerjoin(Review).outerjoin(Photo) ) .group_by(Room.id) ) for room, res_ct, rev_ct, p_ct in q: wish_that_I_could_write(room.res_ct, room.rev_ct, room.p_ct, room.score) 

Но как я могу объявить resident_count , review_count т. Д. Как column_property s в классе Room , так что мне не нужно каждый раз создавать этот запрос?

One Solution collect form web for “Как я могу создать свойства column_properties, которые используют группу?”

Вы можете достичь этого результата с помощью сопоставления запросов к объекту следующим образом:

 class ExtendedRoom(object): pass # q is your query mapper(ExtendedRoom, q.statement.alias()) for room in session.query(ExtendedRoom).all(): # now room have review_count and other attributes print(room.review_count) 

Здесь упрощенный пример с column_property .

 from sqlalchemy import create_engine, Column, Integer, MetaData, Table, String, func from sqlalchemy.sql import select from sqlalchemy.orm import sessionmaker, mapper, column_property from sqlalchemy.ext.declarative import declarative_base engine = create_engine('sqlite:///:memory:', echo=True) Session = sessionmaker(bind=engine) Base = declarative_base() session = Session() metadata = MetaData() room = Table('room', metadata, Column('id', Integer, primary_key=True), Column('name', String), Column('num', Integer, default=0), ) metadata.create_all(engine) statement = select([room]).group_by(room.c.id).alias() class Room(object): pass mapper(Room, statement, properties={ 'count': column_property(func.count(statement.c.num)), }) print(session.query(Room).all()) 
  • Изменение других объектов при обновлении / вставке
  • Получение ошибок с передачей параметров с помощью функции fliter_by в SQLAlchemy
  • Сравнение дат с SQLAlchemy, SQLite
  • Создание проекта Flask-Admin во время тестирования
  • Как вложить некоторые родительские поля объекта при сериализации объектов с использованием зефира
  • Как исключить определенные поля для сериализации с помощью jsonpickle?
  • SQLAlchemy запутан?
  • Как получить выполненный SQL-код из SQLAlchemy
  • Ошибка SQLAlchemy Сервер MySQL ушел
  • Неверная транзакция, сохраняющаяся во всех запросах
  • Flask-SQLAlchemy: Тип столбца фото
  •  
    Interesting Posts for Van-Lav

    python: from x import y изменяет предыдущий результат импорта

    Прямоугольник (четырехугольник) Обнаружение выпуклым корпусом

    Django 1.6, Transaction.commit_on_success с Multiprocessing не работает

    передача аргументов функции для подгонки

    Идентификация цветового кода ячейки листа Excel с использованием пакета XLRD

    Объект 'int' не имеет атрибута '__getitem__'

    Алгоритм генерации дробления дерева

    subprocess.wait () не ждет завершения процесса Popen (при использовании потоков)?

    Как создать изображение OpenCV с изображения PIL?

    Для Django 1.7.1 требуется значение по умолчанию для поля, но в базе данных нет записи. Зачем?

    Почему добавление этого метода __init __ () нарушает мою модель Django?

    Очистить

    Python win32com – Автоматизация Word – Как заменить текст в текстовом поле?

    Как вы проверяете, действительно ли клиент для экземпляра MongoDB?

    Python присваивает нескольким переменным одинаковое значение? поведение списка

    Python - лучший язык программирования в мире.