Вы должны использовать функциональный уникальный индекс, чтобы применить это ограничение. К сожалению, механизм определения общей схемы, независимой от базы данных, в 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'
)
)