在SQLAlchemy中按Postgres范围类型过滤/排序

时间:2015-01-06 21:22:29

标签: python postgresql sqlalchemy psycopg2

SQLAlchemy支持Postgres范围类型,如here所述。它使用postgresql+psycopg2方言进行Postgres通信。 These testcases给出了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)
)

我希望,例如,在预定的日期时间开始过滤预订,或者在日期时间开始时订购预订。

因此我希望大致生成这个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)

但是要认识到这可能不起作用,因为lower是python对象上的属性,并且与基础表列没有关联。

一种可能的解决方案可能是找到一种方法来使用SQLAlchemy中的upper()/lower()范围函数。

1 个答案:

答案 0 :(得分:4)

执行此操作的一种方法是使用sqlalchemy中现有的func.lower()/func.upper()方法:

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

这些方法可能是为了支持(un)大写文本而引入的 - 看看其他不可用的postgres函数是否也能以类似的方式实现会很有趣。