首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SqlAlchemy:如何实现DROP TABLE ...层叠?

SqlAlchemy:如何实现DROP TABLE ...层叠?
EN

Stack Overflow用户
提问于 2016-07-31 04:45:18
回答 2查看 8.2K关注 0票数 17

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

我可以执行原始SQL:engine.execute("DROP TABLE %s CASCADE;" % table.name)。然而,我想实现这个行为,这样我就可以为postgresql方言做table.drop(engine)

我们该如何解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-31 07:34:19

您可以像这样使用customize the compilation of constructs

代码语言:javascript
复制
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语句中,同时保持所有其他方言相同。

票数 30
EN

Stack Overflow用户

发布于 2016-07-31 05:01:33

您需要pg_constraint (即a rather complicated table )中的数据,它处理所有约束,包括检查约束和外键。幸运的是,您想要的非常简单。

为了获得引用表foo的所有表的列表,您可以执行如下操作:

代码语言:javascript
复制
SELECT conrelid
  FROM pg_constraint
  WHERE confrelid = <the relid for foo>;

这将为您提供一个表依赖项的列表。但是您可能不想处理relids,所以让我们让它变得更复杂一些:

代码语言:javascript
复制
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语句。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38678336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档