La principal diferencia es que mientras el Index
API
permite definir un índice fuera de la definición de una tabla siempre que pueda hacer referencia a la tabla a través de las construcciones SQL pasadas, un UniqueConstraint
y restricciones en general debe definirse en línea en la definición de la tabla
:
Lo que hay que entender es que durante la construcción de una clase declarativa, una nueva Table
se construye, si no se pasa un __table__
explícito . En su clase de modelo de ejemplo, UniqueConstraint
la instancia está vinculada a un atributo de clase, pero la base declarativa no incluye restricciones en la Table
creada instancia de los atributos. Debes pasarlo en los argumentos de la tabla:
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'),
)
Tenga en cuenta que debe pasar el nombre de la restricción como argumento de palabra clave. También puede pasar la restricción usando Table.append_constraint()
, si se llama antes de cualquier intento de crear la tabla:
class MyTable(DeclBase):
...
MyTable.__table__.append_constraint(
UniqueConstraint('attr_2', 'attr_3', name='my_table_uidx'))