我想在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>
谢谢!
答案 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}),
)