在 SQLAlchemy 中按 Postgres 范围类型筛选/排序



SQLAlchemy 支持 Postgres 范围类型,如此处所述。它使用postgresql+psycopg2方言进行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)
)

例如,我想过滤在给定日期时间开始的预订,或者在日期时间开始之前订购预订。

因此,我希望大致生成这个 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() 范围函数。

一种方法是在sqlalchemy中使用已经存在的func.lower()/func.upper()方法:

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

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

最新更新