2011-07-08 21 views
55

bildiren ORM uzantısını kullanırken birden çok sütun dizini the documentation ve sqlalchemy.Column sınıfındaki yorumlara göre, birden çok sütun içeren bir dizin belirtmek için sqlalchemy.schema.Index sınıfını kullanmamız gerekir.sqlalchemy bildirgesinin

Ancak örnek doğrudan böyle Tablo nesnesini kullanarak bunu nasıl gösterir:

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) 
biz bildirim ORM uzantısı kullanırsam bunu yapmalıyım nasıl

?

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

"a" ve "b" sütunlarında bir dizin istiyorum. , Bir bileşik endeksi isterseniz, yine Table zamanki gibi burada mevcut olduğu

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

sadece bunu beyan etmek gerekmez:

+0

- aslen nefis sorular: __table_args__ aracılığıylaolan argümanlar, Declarative ile hangi * için "birden çok çoklu dizin içeren bir dizin" *). Ama zzzeek'in cevabı her iki olaya da hitap ettiğinden, sanırım. –

cevap

90

bu indeks = Gerçek bayrak normalde çalışır, sadece Column nesnelerdir

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 olarak Indexolabilir: her şey (tamamlandığında bildirim Aa sarmalayıcı sınıf ilanı sonrasında bir Column olarak yorumlanmalıdır için size son 0.6 veya 0.7 olduğumuzdan emin olmak) aynı şekilde çalışır soru birden çok dizin veya birden çok sütun üzerinde tek dizin istediğiniz (ve bunu düzenlenebilir önce daha fazla karıştı olup olmadığı hakkında biraz belirsizdir

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

Teşekkürler, 0.7 ile güncelledim ve __table_args__ kullanarak çalışıyor – yorjo

+2

Şu anda yapmak gibi table_args için bir sözlüğe sahipseniz ne olur? __table_args__ = {'mysql_engine': 'InnoDB'} –

+0

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