我需要删除PostgreSQL数据库中具有外键约束并需要DROP TABLE ... CASCADE
的表。
我可以执行原始SQL:engine.execute("DROP TABLE %s CASCADE;" % table.name)
。
但是,我想实现此行为,以便table.drop(engine)
方言可以postgresql
。
如何处理这个?
答案 0 :(得分:17)
你可以customize the compilation of constructs这样:
from sqlalchemy.schema import DropTable
from sqlalchemy.ext.compiler import compiles
@compiles(DropTable, "postgresql")
def _compile_drop_table(element, compiler, **kwargs):
return compiler.visit_drop_table(element) + " CASCADE"
这会将CASCADE
附加到为postgresql方言发布的DROP TABLE
语句中,同时保持所有其他方言不变。
答案 1 :(得分:0)
您需要pg_constraint
中的a rather complicated table数据来处理所有约束,包括检查约束和外键。幸运的是,你想要的是相当简单的。
为了获取引用表foo
的所有表的列表,您可以执行以下操作:
SELECT conrelid
FROM pg_constraint
WHERE confrelid = <the relid for foo>;
它会为您提供表格依赖项列表。但是你可能不想处理重复,所以让它变得更复杂:
SELECT r.schemaname || '.' || r.relname
FROM pg_stat_user_tables r, pg_constraint c, pg_stat_user_tables s
WHERE
s.relid = c.confrelid AND
c.conrelid = r.relid AND
s.relname = 'foo';
返回一个列表,然后您可以循环并发出单独的DROP TABLE
语句。