Selon la documentation et les commentaires de la sqlalchemy.Column
classe, nous devrions utiliser la classe sqlalchemy.schema.Index
pour spécifier un index contenant plusieurs colonnes.
Cependant, l'exemple montre comment le faire en utilisant directement l'objet Table comme ceci:
meta = MetaData()
mytable = Table('mytable', meta,
# an indexed column, with index "ix_mytable_col1"
Column('col1', Integer, index=True),
# a uniquely indexed column with index "ix_mytable_col2"
Column('col2', Integer, index=True, unique=True),
Column('col3', Integer),
Column('col4', Integer),
Column('col5', Integer),
Column('col6', Integer),
)
# place an index on col3, col4
Index('idx_col34', mytable.c.col3, mytable.c.col4)
Comment faire si nous utilisons l'extension déclarative ORM?
class A(Base):
__tablename__ = 'table_A'
id = Column(Integer, , primary_key=True)
a = Column(String(32))
b = Column(String(32))
Je voudrais un index sur la colonne "a" et "b".
Réponses:
ce ne sont que des
Column
objets, index = True flag fonctionne normalement:si vous souhaitez un index composite, encore une fois
Table
est présent ici comme d'habitude, vous n'avez tout simplement pas à le déclarer, tout fonctionne de la même manière (assurez-vous que vous êtes sur le récent 0.6 ou 0.7 pour que le wrapper déclaratif Aa soit interprété comme unColumn
une fois la déclaration de classe terminée):En 0.7, le
Index
peut également être dans lesTable
arguments, ce qui avec déclaratif est via__table_args__
:la source
Pour compléter la réponse de @ zzzeek .
Si vous souhaitez ajouter un index composite avec DESC et utiliser la méthode déclarative ORM, vous pouvez procéder comme suit.
De plus, je luttais avec la documentation des index fonctionnels de SQSAlchemy, essayant de trouver un moyen de remplacer
mytable.c.somecol
.Nous pouvons simplement utiliser la propriété model et l'appeler
.desc()
:Si vous utilisez Alembic, j'utilise Flask-Migrate, cela génère quelque chose comme:
Enfin, vous devriez avoir la table et les index suivants dans votre base de données PostgreSQL:
la source