首页 > 解决方案 > Sqlalchemy 方言 DATERANGE 与 psycopg2.extras.DateRange 变化界限

问题描述

我需要更改我的 DATERANGE 列的范围。默认值为bounds='[)'.

这是我当前的专栏:

from sqlalchemy.dialects.postgresql import DATERANGE
booked_date = Column(DATERANGE(), nullable=False)

问题是我无法对DATERANGE()我的示例中的 做任何事情,它没有任何参数,也没有关于此的文档。我一直认为这DATERANGE()来自psycopg2.extras.DateRange,但似乎并非如此,因为根据文档DateRange 应该接受这些论点:

class psycopg2.extras.DateRange(lower=None, upper=None, bounds='[)', empty=False)

如何更改bounds我的示例?

psycopg2.extras.DateRange和 和有什么不一样sqlalchemy.dialects.postgresql import DATERANGE

编辑

我的专栏保持原样。但是我需要使用DateRangefrom将 daterange 数据类型添加到数据库中psycopg2

un_daterange = DateRange(undate_lower.date(), undate_upper.date(), bounds="[]")

new_booking = UserBooksRoom(booked_date=un_daterange, date_added=datetime.today(),
booking_type='correction')

这里的问题是,如果我选择 21.01.2019 - 27.01.2019un_daterange将如下所示:DateRange(datetime.date(2019, 1, 21), datetime.date(2019, 1, 27), '[]'),这是正确的,但在数据库中它看起来像这样:[2019-01-21,2019-01-28)。上限高出 1 天,为什么?我认为'[]'意味着包括下限和上限。

此外,在检查预订是否可用时:

我选择日期 19.01.2019 - 21.01.2019,它会正确地告诉我这个日期不可用,因为 21.01.2019 是下限。

如果我选择 27.01.2019 - 30.01.2019 它也是正确的。

如果我选择 28.01.2019 - 30.01.2019,它将告诉日期可用。

所以总而言之它工作正常,date)只是意味着date - 1 day。但为什么会这么复杂?为什么bounds="[]"不工作?

编辑

我再次检查,界限确实有效。如果没有 bound="[]" 它在数据库中看起来像这样:[2019-01-21,2019-01-27)选择 27.01.2019 - 30.01.2019 会告诉我这是可能的,那是错误的。

.lower基本上,当使用和向用户显示范围信息时.upper,您需要从上限中减去 1 天。

标签: pythonsqlsqlalchemypsycopg2

解决方案


不同之处在于

  • psycopg2.extras.DateRange表示一个 Postgresqldaterange 您基于每个值定义界限。
  • sqlalchemy.dialects.postgresql.DATERANGE来自 SQLAlchemy ,从限定名称中应该清楚,并且表示 Postgresql daterange type,如在CREATE TABLE语句等中使用的那样。它不关心您存储在具有此类型的列中的值的范围。

回顾一下:在 SQLAlchemy 中DATERANGE创建模型和Tables 时用于定义列的类型DateRange,如果使用 Psycopg2 作为 DB-API 驱动程序,则用于表示可以存储在此类列中的值。


推荐阅读