2017-05-16 11 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'を使うようにコードを更新しました。 –

関連する問題