2016-11-11 78 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