如何在 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 语句中添加 CASCADE
:DROP 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 如何遍历数组并将每个数组值插入表中?