【问题标题】:SqlAlchemy: How to implement DROP TABLE ... CASCADE?SqlAlchemy:如何实现 DROP TABLE ... CASCADE?
【发布时间】:2016-12-05 07:45:21
【问题描述】:
我需要删除 PostgreSQL 数据库中具有外键约束并需要 DROP TABLE ... CASCADE 的表。
我可以执行原始 SQL:engine.execute("DROP TABLE %s CASCADE;" % table.name)。
但是,我想实现这种行为,以便我可以为postgresql 方言执行table.drop(engine)。
如何解决这个问题?
【问题讨论】:
标签:
python
postgresql
sqlalchemy
【解决方案1】:
你可以这样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 语句中,同时保持所有其他方言相同。
【解决方案2】:
您需要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 语句。