我需要更改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.DateRange
和sqlalchemy.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天。
答案 0 :(得分:1)
不同之处在于
psycopg2.extras.DateRange
代表Postgresql daterange
值。您可以按每个值定义范围。sqlalchemy.dialects.postgresql.DATERANGE
是SQLAlchemy的 ,应从限定名称中清楚看出,它表示Postgresql daterange
类型,如CREATE TABLE
语句等。它并不关心您存储在具有这种类型的列中的值的范围。回顾一下:在创建模型时使用DATERANGE
,并在SQLAlchemy中使用Table
定义列的类型,使用DateRange
表示可以存储在此类列中的值,如果使用Psycopg2作为DB-API驱动程序。