在使用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"), )