postgresql - 如果不存在则创建数据库索引

标签 postgresql sqlalchemy alembic

我有一个 Alembic 迁移,它创建了一些数据库中缺少的数据库索引。示例:

op.create_index(op.f('ix_some_index'), 'table_1', ['column_1'], unique=False)

但是在其他已有索引的环境中迁移失败:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) relation "ix_some_index" already exists

对于这种情况,PostgreSQL 支持 IF NOT EXISTS 选项,但我看不到任何使用 Alembic 或 SQLAlchemy 选项调用它的方法。是否有检查现有索引的规范方法?

最佳答案

这是适用于 PostgreSQL 的有点生硬的解决方案。它只是在创建新索引之前检查是否存在同名索引。

请注意,它不会验证索引是否位于正确的 Postgres 命名空间或任何其他可能相关的信息中。它适用于我的情况,因为我知道没有其他名称冲突的机会:

def index_exists(name):
    connection = op.get_bind()
    result = connection.execute(
        "SELECT exists(SELECT 1 from pg_indexes where indexname = '{}') as ix_exists;"
            .format(name)
    ).first()
    return result.ix_exists

def upgrade():
    if not index_exists('ix_some_index'):
        op.create_index(op.f('ix_some_index'), 'table_1', ['column_1'], unique=False)

关于postgresql - 如果不存在则创建数据库索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43994229/

相关文章:

python - 为什么alembic不能自动生成?

python - 为什么 Flask Migrations 没有检测到字段的长度变化?

sql - 是否可以在不释放行锁的情况下提交一个事务并启动一个新事务?

node.js - 为什么不能将嵌套 JSON 数据 gps 作为未知类型插入?

node.js - 无法从 lambda Nodejs 连接到 EC2 Postgres 数据库

python - 运行 SQLalchemy 立即导致与数据库的连接中止

asp.net - 将 PostgreSQL 与 ASP.NET Core Identity 结合使用时出现 TypeLoadException

python - 具有 "dynamic"模式的 flask-sqlalchemy 跨数据库

python - 接受表名和列名并返回与给定过滤器值匹配的所有主键值的通用函数

python - alembic 并获取最后插入的值