在使用sqlalchemy的声明性ORM扩展时使用多列索引

根据文档: http : //docs.sqlalchemy.org/en/latest/core/constraints.html#indexes

以及sqlalchemy.Column类中的注释,我们应该使用sqlalchemy.schema.Index类来指定包含多个多重索引的索引。

但是,该示例显示了如何通过直接使用Table对象来执行此操作:

 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) 

如果我们使用声明式的ORM扩展,我们应该怎么做呢?

 class A(Base): __tablename__ = 'table_A' id = Column(Integer, , primary_key=True) a = Column(String(32)) b = Column(String(32)) 

我想索引“a”和“b”列。

那些只是Column对象,index = True标志正常工作:

 class A(Base): __tablename__ = 'table_A' id = Column(Integer, primary_key=True) a = Column(String(32), index=True) b = Column(String(32), index=True) 

如果你想要一个复合索引,这里像往常一样再次出现Table ,你不必声明它,一切都是一样的(确保你最近的0.6或者0.7是声明式的Aa包装被解释为类声明完成后的一Column ):

 class A(Base): __tablename__ = 'table_A' id = Column(Integer, primary_key=True) a = Column(String(32)) b = Column(String(32)) Index('my_index', Aa, Ab) 

在0.7中, Index也可以在Table参数中,声明是通过__table_args__

 class A(Base): __tablename__ = 'table_A' id = Column(Integer, primary_key=True) a = Column(String(32)) b = Column(String(32)) __table_args__ = (Index('my_index', "a", "b"), )