2011-07-08 51 views
55

根據the documentationsqlalchemy.Column類中的註釋,我們應該使用類sqlalchemy.schema.Index來指定包含多列的索引。使用sqlalchemy的聲明性ORM擴展時的多列索引

然而,示例說明了如何通過直接使用表對象這樣做:

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」。

+0

的問題是有點不清楚是否要多個索引或多個列的單一索引(以及更困惑之前,我編輯了 - 原來它興高采烈地問*爲「包含多個索引的索引」*)。但不管怎樣,我想,因爲zzzeek的回答解決了這兩種情況。 –

回答

90

那些只是Column對象,指數= 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的聲明機管局包裝到類聲明之後被解釋爲Column完成):

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

Index('my_index', A.a, A.b) 

在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"),) 
+1

謝謝,我更新到0.7,並使用__table_args__工作正常 – yorjo

+2

如果你有像我目前這樣的table_args字典會發生什麼? __table_args__ = {'mysql_engine':'InnoDB'} –

+0

@Nick http://www.sqlalchemy.org/docs/orm/extensions/declarative.html#table-configuration –