Mysql
 sql >> Database >  >> RDS >> Mysql

slqlalchemy UniqueConstraint VS Index(unique=True)

La differenza principale è che mentre l'Index API consente di definire un indice al di fuori di una definizione di tabella purché possa fare riferimento alla tabella tramite i costrutti SQL passati, un UniqueConstraint e vincoli in generale deve essere definito in linea nella definizione della tabella :

La cosa da capire è che durante la costruzione di una classe dichiarativa viene creata una nuova Table viene costruito, se non viene passato un esplicito __table__ . Nella tua classe modello di esempio il UniqueConstraint l'istanza è associata a un attributo di classe, ma la base dichiarativa non include vincoli nella Table creata istanza dagli attributi. Devi passarlo negli argomenti della tabella:

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

Si noti che è necessario passare il nome del vincolo come argomento della parola chiave. Puoi anche superare il vincolo usando Table.append_constraint() , se chiamato prima di qualsiasi tentativo di creare la tabella:

class MyTable(DeclBase):
    ...

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