Mysql
 sql >> Base de données >  >> RDS >> Mysql

slqlalchemy UniqueConstraint VS Index (unique=True)

La principale différence est que si l'Index API permet de définir un index en dehors d'une définition de table tant qu'il peut référencer la table via les constructions SQL transmises, un UniqueConstraint et les contraintes en général doit être défini en ligne dans la définition de table :

La chose à comprendre est que lors de la construction d'une classe déclarative une nouvelle Table est construit, s'il n'est pas passé un __table__ explicite . Dans votre exemple de classe de modèle, le UniqueConstraint l'instance est liée à un attribut de classe, mais la base déclarative n'inclut pas de contraintes dans la Table créée instance à partir d'attributs. Vous devez le passer dans les arguments du tableau :

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'),
    )

Notez que vous devez passer le nom de la contrainte en tant qu'argument mot-clé. Vous pouvez également passer la contrainte en utilisant Table.append_constraint() , s'il est appelé avant toute tentative de création de la table :

class MyTable(DeclBase):
    ...

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