De acuerdo con la documentación y los comentarios de la sqlalchemy.Columnclase, deberíamos usar la clase sqlalchemy.schema.Indexpara especificar un índice que contenga múltiples columnas.
Sin embargo, el ejemplo muestra cómo hacerlo usando directamente el objeto Table de esta manera:
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)
¿Cómo deberíamos hacerlo si usamos la extensión ORM declarativa?
class A(Base):
__tablename__ = 'table_A'
id = Column(Integer, , primary_key=True)
a = Column(String(32))
b = Column(String(32))
Me gustaría un índice en la columna "a" y "b".

Respuestas:
esos son solo
Columnobjetos, index = True flag funciona normalmente:si desea un índice compuesto, nuevamente
Tableestá presente aquí como de costumbre, simplemente no tiene que declararlo, todo funciona igual (asegúrese de estar en 0.6 o 0.7 reciente para que el contenedor declarativo Aa se interprete como unColumndespués de que se complete la declaración de clase):En 0.7 también
Indexpuede estar en losTableargumentos, que con declarativo es a través de__table_args__:fuente
Para completar la respuesta de @ zzzeek .
Si desea agregar un índice compuesto con DESC y utilizar el método declarativo ORM, puede hacer lo siguiente.
Además, estaba luchando con la documentación de índices funcionales de SQSAlchemy, tratando de averiguar cómo sustituir
mytable.c.somecol.Podemos simplemente usar la propiedad del modelo e invocarla
.desc():Si usa Alembic, estoy usando Flask-Migrate, genera algo como:
Finalmente, debería tener la siguiente tabla e índices en su base de datos PostgreSQL:
fuente