2011-07-08 16 views
55

De acuerdo con the documentation y los comentarios en la clase sqlalchemy.Column, debemos usar la clase sqlalchemy.schema.Index para especificar un índice que contenga varias columnas.Índice de columnas múltiples al usar la extensión ORM declarativa de sqlalchemy

Sin embargo, el ejemplo muestra cómo hacerlo utilizando directamente el objeto de tabla de la siguiente manera:

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) 

¿Cómo debemos hacerlo si usamos la extensión ORM declarativa?

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

Me gustaría un índice en la columna "a" y "b".

+0

La pregunta es un poco confuso sobre si desea que varios índices o un índice único en múltiples columnas (y era más confusa antes de lo edité - originalmente deliciosamente preguntó para * "un índice que contiene múltiples índices múltiples" *). Pero no importa, supongo, ya que la respuesta de zzzeek aborda ambos casos. –

Respuesta

90

esos son sólo Column objetos, índice = True indicador funciona con normalidad:

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

si desea un índice compuesto, de nuevo Table está presente aquí como de costumbre simplemente no tiene que declarar que, todo funciona de la misma (asegurarse de que está en la reciente 0.6 o 0.7 para la envoltura Aa declarativa a ser interpretada como una Column después de la declaración de la clase es completa):

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) 

en el 0,7 Index puede estar en el Table argumentos también, que con declarativa es a través de __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

Gracias, actualicé a 0.7 y el uso de __table_args__ funciona bien – yorjo

+2

¿Qué sucede si tienes un diccionario para table_args como lo hago actualmente? __table_args__ = {'mysql_engine': 'InnoDB'} –

+0

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

Cuestiones relacionadas