DROP FUNCTION IF EXISTS remove_all();
CREATE FUNCTION remove_all() RETURNS void AS $$DECLARErec RECORD;cmd text;BEGINcmd := '';
FOR rec IN SELECT'DROP SEQUENCE ' || quote_ident(n.nspname) || '.'|| quote_ident(c.relname) || ' CASCADE;' AS nameFROMpg_catalog.pg_class AS cLEFT JOINpg_catalog.pg_namespace AS nONn.oid = c.relnamespaceWHERErelkind = 'S' ANDn.nspname NOT IN ('pg_catalog', 'pg_toast') ANDpg_catalog.pg_table_is_visible(c.oid)LOOPcmd := cmd || rec.name;END LOOP;
FOR rec IN SELECT'DROP TABLE ' || quote_ident(n.nspname) || '.'|| quote_ident(c.relname) || ' CASCADE;' AS nameFROMpg_catalog.pg_class AS cLEFT JOINpg_catalog.pg_namespace AS nONn.oid = c.relnamespace WHERE relkind = 'r' ANDn.nspname NOT IN ('pg_catalog', 'pg_toast') ANDpg_catalog.pg_table_is_visible(c.oid)LOOPcmd := cmd || rec.name;END LOOP;
FOR rec IN SELECT'DROP FUNCTION ' || quote_ident(ns.nspname) || '.'|| quote_ident(proname) || '(' || oidvectortypes(proargtypes)|| ');' AS nameFROMpg_procINNER JOINpg_namespace nsON(pg_proc.pronamespace = ns.oid)WHEREns.nspname ='public'ORDER BYpronameLOOPcmd := cmd || rec.name;END LOOP;
EXECUTE cmd;RETURN;END;$$ LANGUAGE plpgsql;
SELECT remove_all();
import psycopg2import sys
# Drop all tables from a given database
try:conn = psycopg2.connect("dbname='akcja_miasto' user='postgres' password='postgres'")conn.set_isolation_level(0)except:print "Unable to connect to the database."
cur = conn.cursor()
try:cur.execute("SELECT table_schema,table_name FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_schema,table_name")rows = cur.fetchall()for row in rows:print "dropping table: ", row[1]cur.execute("drop table " + row[1] + " cascade")cur.close()conn.close()except:print "Error: ", sys.exc_info()[1]
-- Schema: public
-- DROP SCHEMA public;
CREATE SCHEMA publicAUTHORIZATION postgres;
但是,相比之下,一个全新的数据库将具有以下内容:
-- Schema: public
-- DROP SCHEMA public;
CREATE SCHEMA publicAUTHORIZATION postgres;
GRANT ALL ON SCHEMA public TO postgres;GRANT ALL ON SCHEMA public TO public;COMMENT ON SCHEMA publicIS 'standard public schema';
对于我来说,使用Python Web框架创建数据库表(web2py),使用前者会导致问题:
<class 'psycopg2.ProgrammingError'> no schema has been selected to create in
在我看来,完全正确的答案是:
DROP SCHEMA public CASCADE;CREATE SCHEMA public;GRANT ALL ON SCHEMA public TO postgres;GRANT ALL ON SCHEMA public TO public;COMMENT ON SCHEMA public IS 'standard public schema';
#!/usr/bin/env bash
PGDB="yourDB"# By exporting user & pass your dont need to interactively type them on executionexport PGUSER="PGusername"export PGPASSWORD="PGpassword"
VIEWS=`psql -d $PGDB -t --command "SELECT string_agg(table_name, ',') FROM information_schema.tables WHERE table_schema='public' AND table_type='VIEW'"`BASETBLS=`psql -d $PGDB -t --command "SELECT string_agg(table_name, ',') FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE'"`
echo Dropping views:${VIEWS}psql $PGDB --command "DROP VIEW IF EXISTS ${VIEWS} CASCADE"echo Dropping tables:${BASETBLS}psql $PGDB --command "DROP TABLE IF EXISTS ${BASETBLS} CASCADE"
DO $$ DECLAREr RECORD;BEGIN-- if the schema you operate on is not "current", you will want to-- replace current_schema() in query with 'schematodeletetablesfrom'-- *and* update the generate 'DROP...' accordingly.FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOPEXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';END LOOP;END $$;
对于你不能只是DROP SCHEMA public CASCADE;、DROP OWNED BY current_user;或其他东西的情况,这是我写的一个独立的SQL脚本,它是事务安全的(即,你可以把它放在BEGIN;和ROLLBACK;之间,只是测试它,或者COMMIT;实际执行行为),并清理“所有”数据库对象……好吧,我们应用程序使用的数据库中使用的所有对象,或者我可以明智地添加,这是:
-- Recreate the schemaDROP SCHEMA public CASCADE;CREATE SCHEMA public;
-- Restore default permissionsGRANT ALL ON SCHEMA public TO postgres;GRANT ALL ON SCHEMA public TO public;
如果您使用的是PostgreSQL 9.3或更高版本,您可能还需要恢复默认授权。
优点:
这将清理整个模式并将其重新创建为新模式。
缺点:
你也会失去其他实体,如Functions、Views、Materialized views等。
2.使用从pg_tables表中获取所有表名。
PostgreSQL将所有表存储在名为pg_table的记录表中。
SELECT'DROP TABLE IF EXISTS "' || tablename || '" CASCADE;'frompg_tables WHERE schemaname = 'public';
如您所见,通过使用子查询,我们可以从模式中删除整个表。
优点:
当其他数据实体很重要并且您只想从模式中删除表时,这种方法对您非常有帮助。
3.终点站
在shell上使用postgres用户登录
$ sudo -u postgres psql
连接您的数据库
$ \c mydatabase
粘贴这些命令:
DROP SCHEMA public CASCADE;CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO postgres;GRANT ALL ON SCHEMA public TO public;
DO $$ DECLAREr RECORD;BEGINFOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOPEXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';END LOOP;END $$;