【问题标题】:Filter on/Order by Postgres range type in SQLAlchemy在 SQLAlchemy 中按 Postgres 范围类型过滤/排序
【发布时间】:2015-01-06 21:22:28
【问题描述】:

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() 范围函数。

【问题讨论】:

    标签: python postgresql sqlalchemy psycopg2


    【解决方案1】:

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

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

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

    【讨论】:

    • 公平地说,我认为funcs 实际上是为了支持从 sqlalchemy 调用数据库函数。这意味着这可能是完全合法的用途,因为 postgres 为字符串(将它们大写)和范围(返回范围的上限)定义了一个 upper 函数。还有一个lower,当然相反。
    猜你喜欢
    • 2017-09-06
    • 1970-01-01
    • 2015-06-01
    • 2012-04-29
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多