gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:11:10 25 4
gpt4 key购买 nike

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 对象的一个​​属性,与基础表列无关。

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

最佳答案

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

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

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

关于python - 在 SQLAlchemy 中按 Postgres 范围类型过滤/排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27807390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com