【发布时间】:2020-06-18 23:31:01
【问题描述】:
我知道只使用原始 sql,我可以像这样添加排除约束:
ADD CONSTRAINT unique_daterange_constraint
EXCLUDE USING gist
( foo WITH =,
daterange(start_date, end_date, '[]') WITH &&
);
但是,我需要能够对 sqlalchemy 做同样的事情。我目前在表 args 中拥有的(不起作用)是:
__table_args__ = (
postgresql.ExcludeConstraint(
("foo", "="),
(DateRange("start_date", "end_date", bounds="[]"), "&&"),
name="unique_daterange_constraint",
using="gist",
),
)
DateRange 是从 psycopg2.extras 导入的,据我了解,这是如何复制上面 sql 中使用的 postgres daterange 类型。
我的堆栈跟踪,在尝试创建 alembic 迁移文件时告诉我 daterange 部分有误
sqlalchemy.exc.ArgumentError: SQL expression object expected, got object of type <class 'psycopg2._range.DateRange'> instead
我知道我可以处理此问题的一种潜在方法(因为它确实需要一个我放置 DateRange 的列)是创建一个 daterange 列和一个触发器,该触发器在插入或更新时使用 start 填充我的 daterange 列和结束日期,但感觉我不应该这样做。看来,如果我可以使用 sql 中的现有列简单地定义一个日期范围,我应该也可以使用 sqlalchemy。
有什么方法可以按照我想要的方式实现吗?
【问题讨论】:
标签: python postgresql sqlalchemy