SQLAlchemy - 根据方言以不同方式编译索引

Posted

技术标签:

【中文标题】SQLAlchemy - 根据方言以不同方式编译索引【英文标题】:SQLAlchemy - Compile Index Differently Depending on Dialect 【发布时间】:2021-12-21 14:42:01 【问题描述】:

我有一个这样的 SQLAlchemy 类:

class TableName(Base):
    __table_args__ = ( 
         Index('index_name', 'column_name'), 
    )

我希望索引的名称根据方言编译不同,因为据我了解,mysql可以编译同名的索引,只要它们在不同的表中,而Sqlite要求每个索引都有一个独特的名字。我们有一些表对 mysql 使用相同的索引名称,我希望它编译为 sqlite 进行测试。这是可能的还是我出于其他原因感到困惑?

【问题讨论】:

【参考方案1】:

我需要编译CreateIndex函数,并使用传入的索引和表名来创建唯一的索引名:

@compiles(CreateIndex, "sqlite")
def compile_index(element, compiler, **kw):
    index_name = element.element.name
    table_name = element.element.table.name 
    column_name = element.element.expressions[0].name
    unique_index_name = f"table_name index_name"
    return "CREATE INDEX \"%s\" ON %s (\"%s\")" % (unique_index_name, table_name, column_name)

【讨论】:

以上是关于SQLAlchemy - 根据方言以不同方式编译索引的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法为Superset提供apache Solr后端?

可以将不同的GCC方言联系在一起吗?

如何在 Django Python 中使用 PostgreSQL 为 SQLAlchemy 连接池设置方言?需要启用预 ping 功能

python之SQLAIchemy

SQLAlchemy 中的星型模式

如何以灵活的方式将嵌套的 pydantic 模型用于 sqlalchemy