Den største forskel er, at mens Index API
tillader at definere et indeks uden for en tabeldefinition, så længe det kan referere til tabellen gennem de beståede SQL-konstruktioner, en UniqueConstraint
og begrænsninger generelt skal defineres inline i tabeldefinitionen
:
Det man skal forstå er, at under konstruktionen af en deklarativ klasse en ny Tabel
er konstrueret, hvis ikke bestået en eksplicit __table__
. I dit eksempelmodel klassen UniqueConstraint
instans er bundet til en klasseattribut, men den deklarative base inkluderer ikke begrænsninger i den oprettede Tabel
instans fra attributter. Du skal sende det i tabelargumenterne:
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'),
)
Bemærk, at du skal sende begrænsningsnavnet som et nøgleordsargument. Du kan også overføre begrænsningen ved hjælp af Table.append_constraint()
, hvis den kaldes før ethvert forsøg på at oprette tabellen:
class MyTable(DeclBase):
...
MyTable.__table__.append_constraint(
UniqueConstraint('attr_2', 'attr_3', name='my_table_uidx'))