Основната разлика е, че докато Индекскод> API
позволява дефиниране на индекс извън дефиницията на таблица, стига да може да препраща към таблицата чрез предадените SQL конструкции, UniqueConstraint
и ограничения като цяло трябва да бъде дефиниран на линия в дефиницията на таблицата
:
Нещото, което трябва да разберете, е, че по време на изграждането на декларативен клас се появява нова Таблица
се конструира, ако не е предадено изрично __table__
. Във вашия примерен клас на модела UniqueConstraint
екземплярът е свързан с атрибут на клас, но декларативната база не включва ограничения в създадената таблица
екземпляр от атрибути. Трябва да го предадете в аргументите на таблицата:
class MyTable(DeclBase):
__tablename__ = 'my_table'
...
# A positional argument tuple, passed to Table constructor
__table_args__ = (
UniqueConstraint(attr_2, attr_3, name='my_table_uidx'),
)
Имайте предвид, че трябва да предадете името на ограничението като аргумент за ключова дума. Можете също да предадете ограничението, като използвате Table.append_constraint()
, ако е извикан преди опити за създаване на таблицата:
class MyTable(DeclBase):
...
MyTable.__table__.append_constraint(
UniqueConstraint('attr_2', 'attr_3', name='my_table_uidx'))