在SQLAlchemy中设置索引限制

时间:2016-09-30 11:59:14

标签: python mysql indexing sqlalchemy

我想在Column定义中或仅通过Index构造函数设置索引的最大限制,但我似乎找不到实现它的方法。

基本上,我想模拟这种MySQL行为:

CREATE TABLE some_table (
  id int(11) NOT NULL AUTO_INCREMENT,
  some_text varchar(2048) DEFAULT NULL,
  PRIMARY KEY (id),
  KEY some_text (some_text(1024)), # <- this line
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;

在SQLAlchemy中我会有类似的东西:

class SomeTable(BaseModel):
  __tablename__ = 'some_table'
  __seqname__ = 'some_table_id_seq'

  id = sa.Column(sa.Integer(11), sa.Sequence(__seqname__), primary_key=True)
  some_text = sa.Column(sa.String(2048), index=True) # <- this line

但我找不到任何可以定制索引限制的内容。类似的东西:

some_text = sa.Column(sa.String(2048), index=True, index_length=1024)

我想因为Column构造函数的这个选项只是Index构造函数的别名,是否有一个自定义参数包含在Index构造函数中以允许此设置?< / p>

谢谢!

2 个答案:

答案 0 :(得分:9)

我认为你可以这样做:

class SomeTable(BaseModel):
  __tablename__ = 'some_table'
  __seqname__ = 'some_table_id_seq'
  __table_args__ = (
      sa.Index("idx_some_text", "some_text", mysql_length=1024),
  )
  id = sa.Column(sa.Integer(11), sa.Sequence(__seqname__), primary_key=True)
  some_text = sa.Column(sa.String(2048))

参考: http://docs.sqlalchemy.org/en/latest/dialects/mysql.html#index-length

答案 1 :(得分:0)

对于复合索引,您可以使用:

class SomeTable(Base):
    __tablename__ = 'some_table'
    id = Column(Integer(11), primary_key=True)
    text_a = Column(TEXT(1024))
    text_b = Column(TEXT(2048))

    __table_args__ = (
        Index("idx_some_table", "id", "text_a", "text_b", mysql_length={'text_a': 64, 'text_b': 32}),
    )