Flask-SQLAlchemy截断/删除表记录并绕过/忽略IntegrityError

时间:2018-08-23 13:42:26

标签: python sqlalchemy flask-sqlalchemy

我发现这很酷,post与删除单个表的记录有关。但是,我试图清除所有表以进行测试,因此为了测试起见,我遇到了一些烦人的IntegrityError

反正有办法绕过这个吗?

IntegrityError: (psycopg2.IntegrityError) update or delete on table
"table_1" violates foreign key constraint "fk_table_2_primary_table_1"
on table "table_2"
  

注意:我不会删除表,只会删除记录。

1 个答案:

答案 0 :(得分:0)

使用PosgreSQL清空数据库,我使用了以下代码:

def delete_tables_and_indexes(engine):
    """ Delete all tableis and indexes """
    if engine.name == 'postgresql':
        # Drop tables
        sql_raw_query = 'select \'drop table if exists "\' || tablename || \'" cascade;\' from pg_tables where schemaname=\'public\';'
        for result in engine.execute(sql_raw_query):
            engine.execute(result[0])
        # Drop types
        sql_raw_query = 'select \'drop type if exists "\' || t.typname || \'";\' '\
            'FROM pg_type t LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace '\
            'WHERE (t.typrelid = 0 OR (SELECT c.relkind = \'c\' FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid)) '\
            'AND NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type el WHERE el.oid = t.typelem AND el.typarray = t.oid) '\
            'AND n.nspname NOT IN (\'pg_catalog\', \'information_schema\');'
        for result in engine.execute(sql_raw_query):
            engine.execute(result[0])

这使用一些原始SQL查询,以postgresql理解的方式删除内容,从而取消所有架构依赖项的链接。

使用SQLite不能以“硬”方式处理那些依赖之王,您可以轻松地使用:

metadata.drop_all(engine)