2015-01-06 3 views
0

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.

ответ

4

Один из способов сделать это, чтобы использовать уже существующие func.lower()/func.upper() методов в SQLAlchemy:

from sqlalchemy import func 
RoomBooking.query.filter(func.lower(RoomBooking.during) == foo).order_by(func.upper(RoomBooking.during)) 

Этих методы, вероятно, были введены для поддержки (не) прописные букв текста - это было бы интересно посмотреть, если другие недоступные Postgres функции могут быть реализованы аналогичным образом.

+1

Чтобы быть справедливым, я думаю, что 'func' на самом деле там, чтобы поддерживать вызовы функций базы данных из sqlalchemy. Это означает, что это, вероятно, вполне законное использование, потому что postgres имеет функцию 'upper', определенную для обеих строк (которая их верхняя часть) и диапазонов (которая возвращает верхнюю границу диапазона). И «нижний», что делает наоборот, конечно. –

Смежные вопросы