2016-11-11 9 views
2

私は現在、Django 1.8とPostgresに基づいて開発されたアプリケーションで作業しています。このアプリはいくつかの環境にインストールされていますが、その中にはレコードを削除する必要があるDBの古いテーブルがあります。Djangoの移行。移行にテーブルが存在するかどうかを確認する方法

私はSQLクエリ以下で移行を書いた:

IF EXISTS (
    SELECT relname FROM pg_class WHERE relname=tablename 
) THEN 
    DELETE FROM tablename END IF; 

しかし、Djangoはこのクエリでエラーがスローされます。

django.db.utils.ProgrammingError: syntax error at or near "IF" 

私は何とか確認することができ、移動中に、そのテーブルが存在する、とだけにして実行クエリは、DROP FROM tablenameのようですか?

答えて

1

django.db.connectionを使用して解決しました。コード:

from django.db import migrations 
from django.db import connection 


class Migration(migrations.Migration): 
    db_cursor = connection.cursor() 
    check_exists_query = "SELECT relname FROM pg_class WHERE relname=%s;" 
    base_query = "DELETE FROM {table} WHERE condition;" 
    tables = [tables] 
    existing_tables = [] 

    for table in tables: 
     db_cursor.execute(check_exists_query, [table]) 
     result = db_cursor.fetchone() 
     if result: 
      existing_tables.append(table) 

    operations = [ 
     migrations.RunSQL(base_query.format(table=existing_table)) for existing_table in existing_tables 
    ] 
+0

これはすべてのテーブルを空にします。だからこそ、質問をして、代わりにデータベースをドロップしないでください? – e4c5

+0

が一致します。最も有用な例ではありません。 'WHERE'条件で削除クエリを更新しました – Greesha0

関連する問題