De acordo com a documentação e os comentários na sqlalchemy.Column
classe, devemos usar a classe sqlalchemy.schema.Index
para especificar um índice que contém várias colunas.
No entanto, o exemplo mostra como fazer isso usando diretamente o objeto Tabela desta forma:
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)
Como devemos fazer isso se usarmos a extensão ORM declarativa?
class A(Base):
__tablename__ = 'table_A'
id = Column(Integer, , primary_key=True)
a = Column(String(32))
b = Column(String(32))
Eu gostaria de um índice na coluna "a" e "b".
Respostas:
esses são apenas
Column
objetos, index = True flag funciona normalmente:se você gostaria de um índice composto, novamente
Table
está presente aqui como de costume, você apenas não precisa declará-lo, tudo funciona da mesma (certifique-se de que você está no recente 0,6 ou 0,7 para o wrapper declarativo Aa ser interpretado como umColumn
depois que a declaração da classe for concluída):No 0.7 o
Index
pode estar nosTable
argumentos também, que com o declarativo é via__table_args__
:fonte
Para completar a resposta de @zzzeek .
Se você quiser adicionar um índice composto com DESC e usar o método declarativo ORM, faça o seguinte.
Além disso, eu estava lutando com a documentação dos Índices Funcionais do SQSAlchemy, tentando descobrir como fazer a substituição
mytable.c.somecol
.Podemos apenas usar a propriedade model e chamá
.desc()
-la:Se você usa o Alembic, estou usando o Flask-Migrate, ele gera algo como:
Finalmente, você deve ter a seguinte tabela e índices em seu banco de dados PostgreSQL:
fonte