De acuerdo con la documentación y los comentarios de la sqlalchemy.Column
clase, deberíamos usar la clase sqlalchemy.schema.Index
para 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
Column
objetos, index = True flag funciona normalmente:si desea un índice compuesto, nuevamente
Table
está 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 unColumn
después de que se complete la declaración de clase):En 0.7 también
Index
puede estar en losTable
argumentos, 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