SQLAlchemy поддерживает типы диапазонов Postgres, как описано here. Он использует диалект postgresql+psycopg2
для коммуникации Postgres. These testcases приводятся примеры использования для типов диапазонов в SQLALchemy.Фильтр по заказу по типу диапазона Postgres в SQLAlchemy
Как я могу фильтровать или упорядочивать один компонент (нижний или верхний) такого поля диапазона в SQLAlchemy?
Используя пример из первого звена
from psycopg2.extras import DateTimeRange
from sqlalchemy.dialects.postgresql import TSRANGE
class RoomBooking(Base):
__tablename__ = 'room_booking'
room = Column(Integer(), primary_key=True)
during = Column(TSRANGE())
booking = RoomBooking(
room=101,
during=DateTimeRange(datetime(2013, 3, 23), None)
)
Я бы, например, хотел фильтровать заказ с во время, которое начинается на данный DateTime или заказать заказы от начала DateTime.
Как таковой я ищу, чтобы генерировать примерно это SQL:
SELECT room, during
FROM room_booking
WHERE lower(during) = foo
ORDER BY upper(during)
Я пробовал конструкты как
RoomBooking.query.filter(RoomBooking.during.lower == foo).order_by(RoomBooking.during.upper)
, но признают, что это, вероятно, не работает, потому что ниже является атрибутом на python и не связан с базовым столбцом таблицы.
Одним из возможных решений этого может быть поиск способа использования функций диапазонаиз SQLAlchemy.
Чтобы быть справедливым, я думаю, что 'func' на самом деле там, чтобы поддерживать вызовы функций базы данных из sqlalchemy. Это означает, что это, вероятно, вполне законное использование, потому что postgres имеет функцию 'upper', определенную для обеих строк (которая их верхняя часть) и диапазонов (которая возвращает верхнюю границу диапазона). И «нижний», что делает наоборот, конечно. –