2017-05-16 9 views
2

데이터베이스에 누락 된 몇 가지 DB 인덱스를 만드는 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 옵션을 사용합니다. 기존 색인을 확인할 수있는 표준 방법이 있습니까?

답변

0

다음은 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) 
+0

그것은 그 중 하나는 올바른 스키마와 쉽게 테이블의 검사를 할 것 (대신 pg_class''의 pg_indexes''사용하는 것이 좋습니다 것 : 나는 이름 충돌의 다른 기회가 없다는 걸 알고 있기 때문에 내 경우에는 작동). pg_class를 사용할 때는'reltype = 0 '대신'relkind ='i '를 사용하는 것이 더 낫다. –

+0

@a_horse_with_no_name 고마워, 나는'pg_indexes'를 사용하도록 코드를 갱신했다. –