Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

slqlalchemy UniqueConstraint VS Index(unique=True)


A principal diferença é que enquanto o Índice API permite definir um índice fora de uma definição de tabela, desde que possa referenciar a tabela através das construções SQL passadas, um UniqueConstraint e restrições em geral deve ser definido inline na definição da tabela :

A coisa a entender é que durante a construção de uma classe declarativa uma nova Tabela é construído, se não for passado um __table__ explícito . Em sua classe de modelo de exemplo, a UniqueConstraint instância está vinculada a um atributo de classe, mas a base declarativa não inclui restrições na Tabela criada instância de atributos. Você deve passá-lo nos argumentos da tabela:
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'),
    )

Observe que você deve passar o nome da restrição como um argumento de palavra-chave. Você também pode passar a restrição usando Tabela.append_constraint() , se chamado antes de qualquer tentativa de criar a tabela:
class MyTable(DeclBase):
    ...

MyTable.__table__.append_constraint(
    UniqueConstraint('attr_2', 'attr_3', name='my_table_uidx'))