如何在 postgres 中删除特定模式中的每个表?

Posted

技术标签:

【中文标题】如何在 postgres 中删除特定模式中的每个表?【英文标题】:How to delete every table in a specific schema in postgres? 【发布时间】:2020-04-30 09:27:21 【问题描述】:

如何删除特定架构中的所有表?只有模式中的表应该被删除。 我已经有了用下面的代码获取的所有表名,但是如何删除所有这些表?

下面是一些psycopg2代码,下面是生成的SQL

writeCon.execute("SELECT table_name FROM information_schema.tables WHERE table_schema='mySchema'")

SELECT table_name FROM information_schema.tables WHERE table_schema='mySchema'

【问题讨论】:

这里有一个问题的链接,可能有您需要的答案:How can I drop all the tables in a PostgreSQL database? 【参考方案1】:

您可以为此使用anonymous code block

注意:我们正在处理DROP TABLE 语句,如果你犯了错误,它们真的很卑鄙;)CASCADE 选项也会删除依赖对象。小心使用!

DO $$
DECLARE
  row record;
BEGIN
    FOR row IN SELECT * FROM pg_tables WHERE schemaname = 'mySchema' 
    LOOP
      EXECUTE 'DROP TABLE mySchema.' || quote_ident(row.tablename) || ' CASCADE';
    END LOOP;
END;
$$;

如果您想删除架构中的所有内容,包括包装器、序列等,请考虑删除架构本身并重新创建:

DROP SCHEMA mySchema CASCADE;
CREATE SCHEMA mySchema;

【讨论】:

不幸的是,我知道如何用 psycopg2 调用此类语句。 如果您在writeCon.execute() 函数中传递此代码会发生什么情况?例如writeCon.execute("DO $$ DECLARE row record; BEGIN FOR row IN SELECT * FROM pg_tables WHERE schemaname = 'mySchema' LOOP EXECUTE 'DROP TABLE mySchema.' || quote_ident(row.tablename); END LOOP; END; $$;") 它说我需要添加一个级联,因为有一些依赖项。我在哪里添加? @GoldenRetriever 尝试在 drop table 语句中添加 CASCADEDROP TABLE mySchema.' || quote_ident(row.tablename) CASCADE; 错误:psycopg2.errors.SyntaxError:“CASCADE”第 3 行或附近的语法错误:“mySchema。” || quote_ident(row.tablename) 级联; E...【参考方案2】:

对于单行命令,您可以使用psql 及其\gexec 功能:

SELECT format('DROP TABLE %I.%I', table_schema, table_name)
FROM information_schema.tables
WHERE table_schema= 'mySchema';\gexec

这将运行查询并将每个结果字符串作为 SQL 命令执行。

【讨论】:

什么是 \gexec ? @GoldenRetriever 见doc

以上是关于如何在 postgres 中删除特定模式中的每个表?的主要内容,如果未能解决你的问题,请参考以下文章

Postgres:删除属于特定角色的所有表(或强制删除角色,忽略依赖对象)

R:如何使用 dplyr(函数 scr_postgres)从 redshift 中的模式中选择表?

如何检查给定模式中是不是存在表

Postgres 9.6 如何遍历数组并将每个数组值插入表中?

Spring Boot jdbc模板在自定义模式下的postgres中找不到表

基于表名的 Postgres 表分区