首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLAlchemy使用naming_convention创建多列索引

SQLAlchemy使用naming_convention创建多列索引
EN

Stack Overflow用户
提问于 2022-05-30 10:23:27
回答 1查看 302关注 0票数 0

我试图为基于模型的表创建多个(即2列索引)。但是我不想给这个索引起具体的名字。我希望naming_conventionalembic revision --autogenerate能够完成命名索引的工作。到目前为止,我有这样的代码:

代码语言:javascript
复制
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,
)

因此,我想避免代码中的“创建名称”部分:

代码语言:javascript
复制
    metadata.naming_convention['ix'] % {
        'table_name': Foo.__tablename__,
        'column_0_N_name': Foo.col1.expression.name + "_" + Foo.col2.expression.name
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-31 13:41:59

经过更多的搜索,有非常简单的解决方案。根据SQLAlchemy问题中的github评论,如果您希望通过Index()创建索引,那么您需要传递name=None参数,并为列填充参数。

因此,上面的代码应该是(保持不变的部分):

代码语言:javascript
复制
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(将多列索引从表模型中声明出来)

代码语言:javascript
复制
class Foo(Base):
    id = Column(Integer, primary_key=True)
    col1 = Column('Col1', Integer)
    col2 = Column('Col2', DateTime)

Index(None, Foo.col1, Foo.col2)

选项2(在表模型中声明多列索引)

代码语言:javascript
复制
class Foo(Base):
    id = Column(Integer, primary_key=True)
    col1 = Column('Col1', Integer)
    col2 = Column('Col2', DateTime)
    __table_args__ = (
        Index(None, 'Col1', 'Col2'),
    )

那么索引名(在这两个选项中)将是:

代码语言:javascript
复制
Foo_Col1_Col2_ix

我还没有在SQLALchemy文档中找到这样的解决方案(也许有?),但是在SQLAlchemy github中有一些关于github问题的答案是好的:)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72432791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档