我需要删除具有外键约束并需要DROP TABLE ... CASCADE的PostgreSQL数据库中的表。
我可以执行原始SQL:engine.execute("DROP TABLE %s CASCADE;" % table.name)。然而,我想实现这个行为,这样我就可以为postgresql方言做table.drop(engine)。
我们该如何解决这个问题?
发布于 2016-07-31 07:34:19
您可以像这样使用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语句中,同时保持所有其他方言相同。
发布于 2016-07-31 05:01:33
您需要pg_constraint (即a rather complicated table )中的数据,它处理所有约束,包括检查约束和外键。幸运的是,您想要的非常简单。
为了获得引用表foo的所有表的列表,您可以执行如下操作:
SELECT conrelid
FROM pg_constraint
WHERE confrelid = <the relid for foo>;这将为您提供一个表依赖项的列表。但是您可能不想处理relids,所以让我们让它变得更复杂一些:
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语句。
https://stackoverflow.com/questions/38678336
复制相似问题