如果它不存在,则创建一个DB索引

时间:2017-05-16 06:45:22

标签: postgresql sqlalchemy alembic

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

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选项调用它的任何方法。是否有规范的方法来检查现有索引?

1 个答案:

答案 0 :(得分:1)

这是一个对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)