我试图为基于模型的表创建多个(即2列索引)。但是我不想给这个索引起具体的名字。我希望naming_convention和alembic revision --autogenerate能够完成命名索引的工作。到目前为止,我有这样的代码:
from sqlalchemy import MetaData
from sqlalchemy.ext.declarative import as_declarative
from sqlalchemy.schema import Index
metadata = MetaData(
naming_convention={
'pk': '%(table_name)s_pk',
'ix': '%(table_name)s_%(column_0_N_name)s_ix',
},
)
@as_declarative(metadata=metadata)
class Base:
pass
class Foo(Base):
id = Column(Integer, primary_key=True)
col1 = Column('Col1', Integer)
col2 = Column('Col2', DateTime)
Index(
metadata.naming_convention['ix'] % {
'table_name': Foo.__tablename__,
'column_0_N_name': Foo.col1.expression.name + "_" + Foo.col2.expression.name
},
Foo.col1,
Foo.col2,
)因此,我想避免代码中的“创建名称”部分:
metadata.naming_convention['ix'] % {
'table_name': Foo.__tablename__,
'column_0_N_name': Foo.col1.expression.name + "_" + Foo.col2.expression.name
}发布于 2022-05-31 13:41:59
经过更多的搜索,有非常简单的解决方案。根据SQLAlchemy问题中的github评论,如果您希望通过Index()创建索引,那么您需要传递name=None参数,并为列填充参数。
因此,上面的代码应该是(保持不变的部分):
from sqlalchemy import MetaData
from sqlalchemy.ext.declarative import as_declarative
from sqlalchemy.schema import Index
metadata = MetaData(
naming_convention={
'pk': '%(table_name)s_pk',
'ix': '%(table_name)s_%(column_0_N_name)s_ix',
},
)
@as_declarative(metadata=metadata)
class Base:
pass选项1(将多列索引从表模型中声明出来)
class Foo(Base):
id = Column(Integer, primary_key=True)
col1 = Column('Col1', Integer)
col2 = Column('Col2', DateTime)
Index(None, Foo.col1, Foo.col2)选项2(在表模型中声明多列索引)
class Foo(Base):
id = Column(Integer, primary_key=True)
col1 = Column('Col1', Integer)
col2 = Column('Col2', DateTime)
__table_args__ = (
Index(None, 'Col1', 'Col2'),
)那么索引名(在这两个选项中)将是:
Foo_Col1_Col2_ix我还没有在SQLALchemy文档中找到这样的解决方案(也许有?),但是在SQLAlchemy github中有一些关于github问题的答案是好的:)
https://stackoverflow.com/questions/72432791
复制相似问题