SqlAlchemy:如何实现DROP TABLE ... CASCADE?

时间:2016-07-30 20:45:18

标签: python postgresql sqlalchemy

我需要删除PostgreSQL数据库中具有外键约束并需要DROP TABLE ... CASCADE的表。

我可以执行原始SQL:engine.execute("DROP TABLE %s CASCADE;" % table.name)。 但是,我想实现此行为,以便table.drop(engine)方言可以postgresql

如何处理这个?

2 个答案:

答案 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语句。