【问题标题】: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 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-12
        • 2011-10-21
        相关资源
        最近更新 更多