Как создать ограничение исключения с диапазоном дат с помощью sqlalchemy - PullRequest
0 голосов
/ 19 июня 2020

Я знаю, что просто используя raw sql, я могу добавить ограничение исключения, например:

ADD CONSTRAINT unique_daterange_constraint
EXCLUDE  USING gist
( foo WITH =, 
  daterange(start_date, end_date, '[]') WITH &&
);

Однако мне нужно иметь возможность сделать то же самое с sqlalchemy. То, что у меня сейчас есть (что не работает) в моих аргументах таблицы:

    __table_args__ = (
    postgresql.ExcludeConstraint(
        ("foo", "="),
        (DateRange("start_date", "end_date", bounds="[]"), "&&"),
        name="unique_daterange_constraint",
        using="gist",
    ),
)

DateRange импортируется из psycopg2.extras, поскольку я понимаю, что именно так реплицировать тип postgres daterange как используется в sql выше.

Моя трассировка стека при попытке создать файл миграции alembi c сообщает мне, что раздел диапазона дат неверен с

sqlalchemy.exc.ArgumentError: SQL expression object expected, got object of type <class 'psycopg2._range.DateRange'> instead

Я знаю, что потенциальный способ, которым я мог бы справиться с этим (поскольку он действительно хочет столбец, в который я помещаю DateRange), - это создать столбец диапазона дат и триггер, который при вставке или обновлении заполняет мой столбец диапазона дат датами начала и окончания, но это похоже на Мне не следовало этого делать. Кажется, что если я могу просто определить диапазон дат, используя существующие столбцы в sql, я также смогу использовать sqlalchemy.

Есть ли способ добиться этого так, как я хочу?

1 Ответ

1 голос
/ 22 июня 2020

Поскольку ожидается объект выражения SQL, укажите его. Предполагая, что вы назвали атрибуты столбца такими же, как их аналоги в БД, и определили Table аргументы после определений столбцов:

__table_args__ = (
    postgresql.ExcludeConstraint(
        ("foo", "="),
        (func.daterange(start_date, end_date, "[]"), "&&"),
        name="unique_daterange_constraint",
        using="gist",
    ),
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...