如何在Postgres中删除特定模式下的所有表?

6

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

以下是一些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'

查询'mySchema'架构下的所有表名。

这是一个链接,可能会有你需要的答案:如何删除 PostgreSQL 数据库中的所有表? - eLMagnifico
2个回答

11

您可以使用一个匿名代码块来实现这个目的。

警告:此代码正在处理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调用这样的语句。 - GoldenRetriever
如果您将此代码放入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; $$;") - Jim Jones
错误:psycopg2.errors.SyntaxError:在“CASCADE”附近有语法错误 第3行:“mySchema。”||引用标识符(行.tablename)CASCADE; E... - GoldenRetriever
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) || ' CASCADE'; END LOOP; END; $$;") - Jim Jones
它有效。谢谢 :) 这是什么语法?我是SQL新手,但从未见过这种类型的语法。 - GoldenRetriever
显示剩余2条评论

4

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

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

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

\gexec 是什么? - GoldenRetriever
@GoldenRetriever 请查看文档 - JGH
无效命令 \gexec。尝试使用 ? 获取帮助。 - Raul Chiarella
@RaulChiarella 似乎您在命令后添加了额外的 . - JGH
只返回翻译文本:没有句号。只需粘贴原样,是Postgres添加了句号。 - Raul Chiarella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接