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