当存在视图时,Postgres 无法删除表



我正在使用sqlalchemy将数据写入 python 的 postgres 表,并使用to_sql()中的if_exists='replace'选项psycopg2。 这将删除表,然后重新创建它。但是,如果我定义了使用该表的视图,则to_sql()命令将失败,因为 postgres 不会删除该表。除了先手动删除视图,重新创建视图之外,还有什么办法吗?谢谢。

如果您的目标是删除包含相关对象(例如 VIEW(的 TABLE,则需要使用 CASCADE 关键字来强制 DROP 相关对象(这是一个递归操作(。

有关详细信息,请参阅 PostgreSQL 依赖项跟踪:

为了保证整个数据库结构的完整性,PostgreSQL 确保不能删除其他对象仍然放置的对象 依赖。

默认情况下这是不可行的,实际上在表上创建 VIEW 是防止意外删除此表的便捷方法。无论如何,您可能还想阅读这篇文章,以使用SQLAlchemy实现CASCADE beahviour。

然后,在重新创建表后,您仍有责任重新创建缺少的相关对象。SQLAlchemy 似乎没有相关视图的表示形式。但是它有一个创建视图的包,可能会在某种程度上填补这个空白(未经测试(。

因此,它不能单独由SQLAlchemy处理。相反,您将需要一个播放 DDL 语句的脚本/函数来重新创建依赖项(可能使用上面提到的包(。

如果你可以使用纯SQL标准(或使用包(重新创建它,那么你不会失去SQLAlchemy ORM的好处(至少是抽象数据库引擎和可移植到另一个引擎的能力(。

关于依赖关系跟踪,查看应重新创建哪些相关对象的简单方法是:

BEGIN;
DROP TABLE mytable CASCADE;
ROLLBACK;

你也可以使用函数pg_depend它非常方便,但特定于PostgreSQL。

最新更新