Sqlalchemy方言DATERANGE与psycopg2.extras.DateRange更改范围

时间:2018-12-13 09:30:34

标签: python sql sqlalchemy psycopg2

我需要更改DATERANGE列的边界。默认值为bounds='[)'

这是我当前的专栏:

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

问题是在示例中,我无法使用DATERANGE()做任何事情,它没有任何参数,因此也没有文档。我一直认为这个DATERANGE()来自psycopg2.extras.DateRange,但事实并非如此,因为根据docs DateRange应该接受以下参数:

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

如何更改示例中的bounds

psycopg2.extras.DateRangesqlalchemy.dialects.postgresql import DATERANGE之间有什么区别?

编辑

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

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.2019 un_daterange看起来像这样:DateRange(datetime.date(2019, 1, 21), datetime.date(2019, 1, 27), '[]'),这是正确的,但是在数据库中看起来像这样:{{1} }。上限高出1天,为什么?我认为[2019-01-21,2019-01-28)表示包含下限和上限。

同时检查是否可以进行预订:

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

如果我选择2019年1月27日-2019年3月31日,这也将是正确的。

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

因此,总而言之,'[]'仅表示date)。但是为什么这么复杂呢?为什么date - 1 day不起作用?

编辑

我再次检查,界限确实起作用。如果没有bound =“ []”,则它在数据库中看起来像这样:bounds="[]",然后选择27.01.2019-30.01.2019将告诉我这是可能的,那将是错误的。

基本上,当使用[2019-01-21,2019-01-27).lower向用户显示范围信息时,您需要从上限减去1天。

1 个答案:

答案 0 :(得分:1)

不同之处在于

  • psycopg2.extras.DateRange代表Postgresql daterange 。您可以按每个值定义范围。
  • sqlalchemy.dialects.postgresql.DATERANGE是SQLAlchemy的 ,应从限定名称中清楚看出,它表示Postgresql daterange 类型,如CREATE TABLE语句等。它并不关心您存储在具有这种类型的列中的的范围。

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