Составной UniqueConstraint с функцией - PullRequest
3 голосов
/ 02 октября 2009

Быстрый вопрос по SQLAlchemy ...

У меня есть класс «Документ» с атрибутами «Номер» и «Дата». Мне нужно убедиться, что нет дублирующегося номера для того же года , Есть ли способ иметь UniqueConstraint на «Число + год (Дата)»? Должен ли я использовать уникальный индекс вместо этого? Как бы я объявил функциональную часть?

(SQLAlchemy 0.5.5, PostgreSQL 8.3.4)

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 04 октября 2009

Вы должны использовать функциональный уникальный индекс, чтобы применить это ограничение. К сожалению, механизм определения общей схемы, независимой от базы данных, в SQLAlchemy пока не абстрагирует функциональные индексы. Вам придется использовать конструкцию DDL для регистрации пользовательских определений схемы. Если вы используете декларативный подход к объявлению вашей схемы, добавьте следующее после определения класса:

DDL(
    "CREATE UNIQUE INDEX doc_year_num_uniq ON %(fullname)s "
    "(EXTRACT(YEAR FROM date), number)"
).execute_at('after-create', Document.__table__)

Этот метод работает очень хорошо, но выдает предупреждение SADeprecation в v0.7 Синтаксис, который я успешно использовал:

from sqlalchemy import event

event.listen(ModelObject.__table__,
         'after_create',
          DDL("CREATE UNIQUE INDEX term_year ON %(fullname)s "
              "(EXTRACT(YEAR FROM start_date), term)",
              on = 'postgresql'
              )
         )
0 голосов
/ 02 октября 2009

Я почти уверен, что уникальные ограничения могут применяться только к столбцам, в которых уже есть данные, но не к выражениям, вычисляемым во время выполнения. Следовательно, вам нужно будет создать дополнительный столбец, содержащий часть year вашего date, для которой вы можете создать уникальное ограничение вместе с number. Чтобы наилучшим образом использовать этот подход, возможно, вам следует хранить ваш date в трех отдельных столбцах, содержащих день, месяц и год. Это можно сделать, используя ограничения по умолчанию в определении таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...