명령줄에서 작동하는 PostgreSQL의 모든 테이블을 삭제하려면 어떻게 해야 합니까?
데이터베이스 자체를 삭제하고 싶지 않고 모든 테이블과 그 안의 모든 데이터만 삭제하고 싶습니다.
질문자 :AP257
명령줄에서 작동하는 PostgreSQL의 모든 테이블을 삭제하려면 어떻게 해야 합니까?
데이터베이스 자체를 삭제하고 싶지 않고 모든 테이블과 그 안의 모든 데이터만 삭제하고 싶습니다.
모든 테이블이 단일 스키마에 있는 경우 이 접근 방식이 작동할 수 있습니다(아래 코드에서는 스키마 이름이 public
이라고 가정).
DROP SCHEMA public CASCADE; CREATE SCHEMA public;
PostgreSQL 9.3 이상을 사용하는 경우 기본 권한을 복원해야 할 수도 있습니다.
GRANT ALL ON SCHEMA public TO postgres; GRANT ALL ON SCHEMA public TO public;
다음과 같이 SQL 스크립트를 생성하는 쿼리를 작성할 수 있습니다.
select 'drop table "' || tablename || '" cascade;' from pg_tables;
또는:
select 'drop table if exists "' || tablename || '" cascade;' from pg_tables;
이전 문장의 cascade 옵션으로 인해 일부 테이블이 자동으로 삭제되는 경우.
또한 주석에 명시된 대로 스키마 이름별로 삭제하려는 테이블을 필터링할 수 있습니다.
select 'drop table if exists "' || tablename || '" cascade;' from pg_tables where schemaname = 'public'; -- or any other schema
그런 다음 실행하십시오.
영광스러운 COPY+PASTE도 작동합니다.
이 글(2014년 1월) 현재 가장 많이 받아들여지는 답변은 다음과 같습니다.
drop schema public cascade; create schema public;
이것은 작동하지만 공개 스키마를 원래 상태로 복원하려는 경우 작업을 완전히 수행하지 못합니다. PostgreSQL 9.3.1용 pgAdmin III에서 이렇게 생성된 "공개" 스키마를 클릭하고 "SQL 창"을 보면 다음과 같이 표시됩니다.
-- Schema: public -- DROP SCHEMA public; CREATE SCHEMA public AUTHORIZATION postgres;
그러나 대조적으로 새로운 데이터베이스에는 다음이 포함됩니다.
-- Schema: public -- DROP SCHEMA public; CREATE SCHEMA public AUTHORIZATION postgres; GRANT ALL ON SCHEMA public TO postgres; GRANT ALL ON SCHEMA public TO public; COMMENT ON SCHEMA public IS 'standard public schema';
데이터베이스 테이블(web2py)을 생성하는 python 웹 프레임워크를 사용하는 경우 전자를 사용하여 문제가 발생했습니다.
<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';
또한 pgAdmin III에서 이러한 명령을 실행하려면 쿼리 도구( 돋보기 아이콘 "임의 SQL 쿼리 실행")를 사용하거나 플러그인-> PSQL 콘솔을 사용할 수 있습니다.
메모
설치된 확장이 있는 경우 스키마를 삭제할 때 삭제되므로 설치해야 하는 항목을 기록한 다음 필요에 따라 명령문을 실행해야 합니다. 예
CREATE EXTENSION postgis;
다음을 사용하여 모든 테이블을 삭제할 수 있습니다.
DO $$ DECLARE r 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()) LOOP EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE'; END LOOP; END $$;
IMO이보다 더 drop schema public
하면 다시 할 필요가 없기 때문에, schema
모든 보조금을 복원합니다.
여기에는 외부 스크립팅 언어가 필요하지 않으며 생성된 SQL을 인터프리터에 다시 복사하여 붙여넣을 필요도 없다는 추가 보너스.
삭제하려는 모든 항목이 동일한 사용자의 소유인 경우 다음을 사용할 수 있습니다.
drop owned by the_user;
그러면 사용자가 소유한 모든 항목 이 삭제됩니다.
여기에는 구체화된 보기, 보기, 시퀀스, 트리거, 스키마, 함수, 유형, 집계, 연산자, 도메인 등(따라서, 실제로: 모든 것 ) the_user
소유하는(=생성된) 포함됩니다.
the_user
를 실제 사용자 이름으로 바꿔야 합니다. 현재 "현재 사용자"에 대한 모든 것을 삭제할 수 있는 옵션은 없습니다. 다가오는 9.5 버전에는 drop owned by current_user
옵션이 있습니다.
매뉴얼의 자세한 내용: http://www.postgresql.org/docs/current/static/sql-drop-own.html
위의 Pablo에 따라 대소문자와 관련하여 특정 스키마에서 삭제하려면 다음을 수행합니다.
select 'drop table "' || tablename || '" cascade;' from pg_tables where schemaname = 'public';
이것은 정말 흥미로운 질문이며 여러 가지 방법으로 해결할 수 있습니다.
여기에서는 일반적 public
스키마가 있습니다. 그래서 예시로 사용하고 있습니다.
-- Recreate the schema DROP SCHEMA public CASCADE; CREATE SCHEMA public; -- Restore default permissions GRANT ALL ON SCHEMA public TO postgres; GRANT ALL ON SCHEMA public TO public;
PostgreSQL 9.3 이상을 사용하는 경우 기본 권한을 복원해야 할 수도 있습니다.
장점:
이렇게 하면 전체 스키마가 정리되고 새 스키마로 다시 생성됩니다.
단점:
Functions
, Views
, Materialized views
등과 같은 다른 엔터티도 잃게 됩니다.
pg_tables
테이블에서 모든 테이블 이름 가져오기를 사용합니다. pg_table
이라는 레코드 테이블에 모든 테이블을 저장합니다.
SELECT 'DROP TABLE IF EXISTS "' || tablename || '" CASCADE;' from pg_tables WHERE schemaname = 'public';
보시다시피, 하위 쿼리를 사용하여 스키마에서 전체 테이블을 제거할 수 있습니다.
장점:
다른 데이터 엔터티가 중요하고 스키마에서 테이블만 삭제하려는 경우 이 접근 방식이 매우 유용합니다.
$ 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;
참고: 이 명령 묶음은 첫 번째 요점과 유사하므로 장단점은 동일하게 유지됩니다.
drop schema public cascade;
트릭을해야합니다.
Pablo와 LenW에 이어 다음은 준비와 실행을 모두 수행하는 한 줄짜리입니다.
psql -U $PGUSER $PGDB -t -c "select 'drop table \"' || tablename || '\" cascade;' from pg_tables where schemaname = 'public'" | psql -U $PGUSER $PGDB
$PGUSER
및 $PGDB
를 원하는 값으로 설정하거나 바꾸십시오.
다음 단계가 도움이 될 수 있습니다(Linux 사용자의 경우).
먼저 다음 명령으로 postgres
명령 프롬프트를 입력합니다.
sudo -u postgres psql
이 명령으로 데이터베이스를 입력합니다(내 데이터베이스 이름: maoss
):
\c maoss
이제 모든 테이블을 삭제하는 명령을 입력합니다.
DROP SCHEMA public CASCADE; CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO postgres; GRANT ALL ON SCHEMA public TO public;
PL/PGSQL 절차 언어가 설치되어 있는 경우 다음을 사용하여 셸/Perl 외부 스크립트 없이 모든 것을 제거할 수 있습니다.
DROP FUNCTION IF EXISTS remove_all(); CREATE FUNCTION remove_all() RETURNS void AS $$ DECLARE rec RECORD; cmd text; BEGIN cmd := ''; FOR rec IN SELECT 'DROP SEQUENCE ' || quote_ident(n.nspname) || '.' || quote_ident(c.relname) || ' CASCADE;' AS name FROM pg_catalog.pg_class AS c LEFT JOIN pg_catalog.pg_namespace AS n ON n.oid = c.relnamespace WHERE relkind = 'S' AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND pg_catalog.pg_table_is_visible(c.oid) LOOP cmd := cmd || rec.name; END LOOP; FOR rec IN SELECT 'DROP TABLE ' || quote_ident(n.nspname) || '.' || quote_ident(c.relname) || ' CASCADE;' AS name FROM pg_catalog.pg_class AS c LEFT JOIN pg_catalog.pg_namespace AS n ON n.oid = c.relnamespace WHERE relkind = 'r' AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND pg_catalog.pg_table_is_visible(c.oid) LOOP cmd := cmd || rec.name; END LOOP; FOR rec IN SELECT 'DROP FUNCTION ' || quote_ident(ns.nspname) || '.' || quote_ident(proname) || '(' || oidvectortypes(proargtypes) || ');' AS name FROM pg_proc INNER JOIN pg_namespace ns ON (pg_proc.pronamespace = ns.oid) WHERE ns.nspname = 'public' ORDER BY proname LOOP cmd := cmd || rec.name; END LOOP; EXECUTE cmd; RETURN; END; $$ LANGUAGE plpgsql; SELECT remove_all();
"psql" 프롬프트에서 이것을 입력하는 대신 파일에 복사한 다음 "--file" 또는 "-f" 옵션을 사용하여 파일을 psql에 입력으로 전달하는 것이 좋습니다.
psql -f clean_all_pg.sql
크레딧이 필요한 크레딧: 함수를 작성했지만 쿼리(또는 최소한 첫 번째 쿼리)는 몇 년 전에 pgsql 메일링 리스트 중 하나에 있는 누군가로부터 온 것 같습니다. 정확히 언제 또는 어느 것이 기억나지 않습니다.
어쨌든 모든 테이블을 핵으로 만들고 싶다면 모든 테이블을 단일 명령문에 넣어 CASCADE와 같은 멋진 기능을 생략할 수 있습니다. 이것은 또한 실행을 더 빠르게 만듭니다.
SELECT 'TRUNCATE TABLE ' || string_agg('"' || tablename || '"', ', ') || ';' FROM pg_tables WHERE schemaname = 'public';
직접 실행:
DO $$ DECLARE tablenames text; BEGIN tablenames := string_agg('"' || tablename || '"', ', ') FROM pg_tables WHERE schemaname = 'public'; EXECUTE 'TRUNCATE TABLE ' || tablenames; END; $$
TRUNCATE
를 해당되는 경우 DROP
으로 바꿉니다.
생성된 SQL 명령이 하나의 단일 문자열로 반환되도록 하기 위해 Pablo의 답변을 약간 수정했습니다.
select string_agg('drop table "' || tablename || '" cascade', '; ') from pg_tables where schemaname = 'public'
pgAdmin에서 다음 스크립트를 사용하십시오.
DO $$ DECLARE brow record; BEGIN FOR brow IN (select 'drop table "' || tablename || '" cascade;' as table_name from pg_tables where schemaname = 'public') LOOP EXECUTE brow.table_name; END LOOP; END; $$
만일을 대비하여... Postgresql 데이터베이스를 정리하는 간단한 Python 스크립트
import psycopg2 import 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]
파이썬이 그것에 의존하기 때문에 그것을 복사한 후에 들여쓰기가 올바른지 확인하십시오.
string_agg 함수를 사용하여 DROP TABLE에 완벽한 쉼표로 구분된 목록을 만들 수 있습니다. bash 스크립트에서:
#!/bin/bash TABLES=`psql $PGDB -t --command "SELECT string_agg(table_name, ',') FROM information_schema.tables WHERE table_schema='public'"` echo Dropping tables:${TABLES} psql $PGDB --command "DROP TABLE IF EXISTS ${TABLES} CASCADE"
데이터를 삭제하려는 경우(테이블 삭제가 아님):
-- Truncate tables and restart sequnces SELECT 'TRUNCATE TABLE "' || table_schema || '"."' || table_name || '" RESTART IDENTITY CASCADE;' FROM information_schema.tables WHERE table_catalog = '<database>' AND table_schema = '<schema>';
또는 테이블을 삭제하려면 다음 SQL을 사용할 수 있습니다.
-- For tables SELECT 'DROP TABLE "' || table_schema || '"."' || table_name || '" CASCADE;' FROM information_schema.tables WHERE table_catalog = '<database>' AND table_schema = '<schema>'; -- For sequences SELECT 'DROP SEQUENCE d_a_seq "' || sequence_schema || '"."' || sequence_name || '";' FROM information_schema.sequences WHERE sequence_catalog = '<database>' AND sequence_schema = '<schema>';
참고: 내 대답은 테이블 및 기타 데이터베이스 개체를 실제로 삭제하는 것입니다. 에 대한 테이블의 모든 데이터를 삭제, 즉 모든 테이블을 절단 , Endre를 두 달 후에 이와 비슷하게 잘 실행 (직접 실행) 문을 제공하고 있습니다.
DROP SCHEMA public CASCADE;
수 없는 경우; , 현재 사용자가 DROP OWNED BY current_user;
또는 무엇인가, 여기에 내가 작성한 독립 실행형 SQL 스크립트가 있습니다. 이 스크립트는 트랜잭션에 안전합니다(즉 BEGIN;
사이에 넣을 수 있고 ROLLBACK;
테스트만 하거나 COMMIT;
실제로 행위를 수행하려면). " 데이터베이스 개체... 음, 우리 응용 프로그램이 사용하는 데이터베이스에 사용된 모든 개체 또는 내가 현명하게 추가할 수 있는 개체는 다음과 같습니다.
CHECK
, UNIQUE
)VIEW
s(정상 또는 구체화됨)public
또는 DB 내부가 아닌) 스키마 "우리"가 소유합니다. 스크립트는 "데이터베이스 수퍼유저가 아닌"으로 실행할 때 유용합니다. 수퍼유저는 모든 스키마를 삭제할 수 있습니다(정말 중요한 스키마는 여전히 명시적으로 제외되지만)삭제되지 않은 것은 (일부는 고의적이며 일부는 DB에 예가 없기 때문에)
public
스키마(예: 확장에서 제공하는 내용) 이것은 복원하려는 덤프가 복원하려는 데이터베이스와 다른 데이터베이스 스키마 버전(예: Debian dbconfig-common
, Flyway 또는 Liquibase/DB-Manul 사용)인 경우에 정말 유용합니다.
나는 또한 누군가가 관심을 가질 경우를 대비하여 "두 개의 테이블과 그 테이블에 속한 것을 제외한 모든 것"(시퀀스, 수동으로 테스트됨, 죄송합니다, 알고 있습니다, 지루함)을 삭제하는 버전이 있습니다. 차이가 작습니다. 관심이 있는 경우 저에게 연락하거나 이 리포지토리를 확인하십시오.
-- Copyright © 2019, 2020 -- mirabilos <t.glaser@tarent.de> -- -- Provided that these terms and disclaimer and all copyright notices -- are retained or reproduced in an accompanying document, permission -- is granted to deal in this work without restriction, including un‐ -- limited rights to use, publicly perform, distribute, sell, modify, -- merge, give away, or sublicence. -- -- This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to -- the utmost extent permitted by applicable law, neither express nor -- implied; without malicious intent or gross negligence. In no event -- may a licensor, author or contributor be held liable for indirect, -- direct, other damage, loss, or other issues arising in any way out -- of dealing in the work, even if advised of the possibility of such -- damage or existence of a defect, except proven that it results out -- of said person's immediate fault when using the work as intended. -- - -- Drop everything from the PostgreSQL database. DO $$ DECLARE q TEXT; r RECORD; BEGIN -- triggers FOR r IN (SELECT pns.nspname, pc.relname, pt.tgname FROM pg_catalog.pg_trigger pt, pg_catalog.pg_class pc, pg_catalog.pg_namespace pns WHERE pns.oid=pc.relnamespace AND pc.oid=pt.tgrelid AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast') AND pt.tgisinternal=false ) LOOP EXECUTE format('DROP TRIGGER %I ON %I.%I;', r.tgname, r.nspname, r.relname); END LOOP; -- constraints #1: foreign key FOR r IN (SELECT pns.nspname, pc.relname, pcon.conname FROM pg_catalog.pg_constraint pcon, pg_catalog.pg_class pc, pg_catalog.pg_namespace pns WHERE pns.oid=pc.relnamespace AND pc.oid=pcon.conrelid AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast') AND pcon.contype='f' ) LOOP EXECUTE format('ALTER TABLE ONLY %I.%I DROP CONSTRAINT %I;', r.nspname, r.relname, r.conname); END LOOP; -- constraints #2: the rest FOR r IN (SELECT pns.nspname, pc.relname, pcon.conname FROM pg_catalog.pg_constraint pcon, pg_catalog.pg_class pc, pg_catalog.pg_namespace pns WHERE pns.oid=pc.relnamespace AND pc.oid=pcon.conrelid AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast') AND pcon.contype<>'f' ) LOOP EXECUTE format('ALTER TABLE ONLY %I.%I DROP CONSTRAINT %I;', r.nspname, r.relname, r.conname); END LOOP; -- indicēs FOR r IN (SELECT pns.nspname, pc.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns WHERE pns.oid=pc.relnamespace AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast') AND pc.relkind='i' ) LOOP EXECUTE format('DROP INDEX %I.%I;', r.nspname, r.relname); END LOOP; -- normal and materialised views FOR r IN (SELECT pns.nspname, pc.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns WHERE pns.oid=pc.relnamespace AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast') AND pc.relkind IN ('v', 'm') ) LOOP EXECUTE format('DROP VIEW %I.%I;', r.nspname, r.relname); END LOOP; -- tables FOR r IN (SELECT pns.nspname, pc.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns WHERE pns.oid=pc.relnamespace AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast') AND pc.relkind='r' ) LOOP EXECUTE format('DROP TABLE %I.%I;', r.nspname, r.relname); END LOOP; -- sequences FOR r IN (SELECT pns.nspname, pc.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns WHERE pns.oid=pc.relnamespace AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast') AND pc.relkind='S' ) LOOP EXECUTE format('DROP SEQUENCE %I.%I;', r.nspname, r.relname); END LOOP; -- extensions (only if necessary; keep them normally) FOR r IN (SELECT pns.nspname, pe.extname FROM pg_catalog.pg_extension pe, pg_catalog.pg_namespace pns WHERE pns.oid=pe.extnamespace AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast') ) LOOP EXECUTE format('DROP EXTENSION %I;', r.extname); END LOOP; -- aggregate functions first (because they depend on other functions) FOR r IN (SELECT pns.nspname, pp.proname, pp.oid FROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pns, pg_catalog.pg_aggregate pagg WHERE pns.oid=pp.pronamespace AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast') AND pagg.aggfnoid=pp.oid ) LOOP EXECUTE format('DROP AGGREGATE %I.%I(%s);', r.nspname, r.proname, pg_get_function_identity_arguments(r.oid)); END LOOP; -- routines (functions, aggregate functions, procedures, window functions) IF EXISTS (SELECT * FROM pg_catalog.pg_attribute WHERE attrelid='pg_catalog.pg_proc'::regclass AND attname='prokind' -- PostgreSQL 11+ ) THEN q := 'CASE pp.prokind WHEN ''p'' THEN ''PROCEDURE'' WHEN ''a'' THEN ''AGGREGATE'' ELSE ''FUNCTION'' END'; ELSIF EXISTS (SELECT * FROM pg_catalog.pg_attribute WHERE attrelid='pg_catalog.pg_proc'::regclass AND attname='proisagg' -- PostgreSQL ≤10 ) THEN q := 'CASE pp.proisagg WHEN true THEN ''AGGREGATE'' ELSE ''FUNCTION'' END'; ELSE q := '''FUNCTION'''; END IF; FOR r IN EXECUTE 'SELECT pns.nspname, pp.proname, pp.oid, ' || q || ' AS pt FROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pns WHERE pns.oid=pp.pronamespace AND pns.nspname NOT IN (''information_schema'', ''pg_catalog'', ''pg_toast'') ' LOOP EXECUTE format('DROP %s %I.%I(%s);', r.pt, r.nspname, r.proname, pg_get_function_identity_arguments(r.oid)); END LOOP; -- nōn-default schemata we own; assume to be run by a not-superuser FOR r IN (SELECT pns.nspname FROM pg_catalog.pg_namespace pns, pg_catalog.pg_roles pr WHERE pr.oid=pns.nspowner AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast', 'public') AND pr.rolname=current_user ) LOOP EXECUTE format('DROP SCHEMA %I;', r.nspname); END LOOP; -- voilà RAISE NOTICE 'Database cleared!'; END; $$;
PostgreSQL 9.6( jessie-backports
)에서 나중에 추가된 사항( Clément Prévost 가 기여한 extensions
9.6 및 12.2에서 집계 제거 테스트, 12.2에서도 절차 제거 테스트 버그 수정 및 추가 개선을 환영합니다!
테이블과 시퀀스를 삭제해야 합니다. 여기에 저에게 효과적이었습니다.
psql -qAtX -c "select 'DROP TABLE IF EXISTS ' || quote_ident(table_schema) || '.' || quote_ident(table_name) || ' CASCADE;' FROM information_schema.tables where table_type = 'BASE TABLE' and not table_schema ~ '^(information_schema|pg_.*)$'" | psql -qAtX psql -qAtX -c "select 'DROP SEQUENCE IF EXISTS ' || quote_ident(relname) || ' CASCADE;' from pg_statio_user_sequences;" | psql -qAtX
명령을 실행하기 전에 postgres
사용자에게 sudo/su 또는 (연결 세부 정보 PGHOST
, PGPORT
, PGUSER
및 PGPASSWORD
내보내기 ) 그런 다음 export PGDATABASE=yourdatabase
현재 데이터베이스의 모든 테이블을 파괴하기 위한 Rails용 Rake 작업
namespace :db do # rake db:drop_all_tables task drop_all_tables: :environment do query = <<-QUERY SELECT table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND table_schema NOT IN ('pg_catalog', 'information_schema'); QUERY connection = ActiveRecord::Base.connection results = connection.execute query tables = results.map do |line| table_name = line['table_name'] end.join ", " connection.execute "DROP TABLE IF EXISTS #{ tables } CASCADE;" end end
Jamie는 기본 테이블 유형인 "기본 테이블"만 존중하기 때문에 뷰를 처리하여 bash 메서드를 향상시켰습니다.
다음 bash 코드는 보기를 먼저 삭제한 다음 나머지를 모두 삭제합니다.
#!/usr/bin/env bash PGDB="yourDB" # By exporting user & pass your dont need to interactively type them on execution export 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"
Windows 배치 파일에서:
@echo off FOR /f "tokens=2 delims=|" %%G IN ('psql --host localhost --username postgres --command="\dt" YOUR_TABLE_NAME') DO ( psql --host localhost --username postgres --command="DROP table if exists %%G cascade" sfkb echo table %%G dropped )
글쎄, 나는 커맨드 라인에서 일하는 것을 좋아하기 때문에 ...
psql -U <user> -d <mydb> -c '\dt' | cut -d ' ' -f 4 | sed -e "s/^/drop table if exists /" | sed -e "s/$/;/"
-c '\dt'
는 list tables 명령을 호출합니다.
List of relations Schema | Name | Type | Owner --------+-------------------+-------+---------- public | _d_psidxddlparm | table | djuser public | _d_psindexdefn | table | djuser
cut -d ' ' -f 4
이제 출력을 파이프하여 테이블인 4번째 필드(공백을 구분 기호로 사용할 때)를 가져옵니다.
sed
drop table
에 접두사를 붙이고 접미사를 붙입니다 ;
명령 구분자.
| egrep '_d_'
grep
파이프를 추가하면 삭제할 테이블에 대해 더 선택적으로 지정할 수 있습니다.
drop table if exists _d_psidxddlparm; drop table if exists _d_psindexdefn;
\dt
명령 출력과 끝에 있는 총 행에 대해 가짜 행이 생성됩니다. 나는 grepping으로 그것을 피하지만 head
와 tail
사용할 수 있습니다.
가장 쉬운 방법은 다른 사람들이 이전 답변에서 제안한 대로 공개 스키마를 삭제하는 것입니다. 그러나 이것은 좋은 방법이 아닙니다. 그 이후로 잊혀지고 문서화되지 않은 공개 스키마에 대해 수행된 작업을 알 수 없습니다. 또한 이것이 미래에도 동일하게 작동할 것인지 알 수 없습니다. V9에서는 괜찮았지만 V10에서는 모든 사용자가 스키마에 대한 액세스 권한을 잃게 되며 액세스 권한을 다시 부여받아야 합니다. 그렇지 않으면 애플리케이션이 중단됩니다. 나는 V11을 확인하지 않았지만 요점은 기계에서 기계로, 사이트에서 사이트로 또는 버전에서 버전으로 이동할 때 무엇이 중단될지 결코 모른다는 것입니다. 데이터베이스에 대한 액세스 권한은 있지만 스키마에는 액세스할 수 없는 사용자인 경우에도 수행할 수 없습니다.
프로그래밍 방식으로 이 작업을 수행해야 하는 경우 위의 다른 답변에서 이를 다루지만 위의 답변에서 고려하지 않는 한 가지는 Postgres가 작업을 수행하도록 하는 것입니다. 아래와 같이 -c 옵션과 함께 pg_dump를 사용하는 경우:
sudo su postgres -c "pg_dump -U postgres WhateverDB -c -f "/home/Anyone/DBBackupWhateverDB-ServerUnscheduled.sql""
그러면 모든 테이블을 삭제할 sql 문으로 DB 복원 스크립트가 생성됩니다.
질문을 하는 유일한 목적이 복원 전에 테이블을 삭제하는 것이라면 복원이 자동으로 작업을 수행합니다.
그러나 다른 용도로 필요한 경우 sql 스크립트에서 drop 문을 복사하기만 하면 됩니다.
psql
사용하는 터미널 기반 접근 방식이 가장 적합했습니다. 개발에 편리하기 때문에 bash 함수도 만들었습니다.
psqlDropTables() { PGPASSWORD=<your password> PGTABLE=<your table name> PGUSER=<your pg user name> PGPASSWORD=$PGPASSWORD psql -ah 127.0.0.1 $PGTABLE $PGUSER -c " SELECT 'DROP TABLE IF EXISTS \"' || tablename || '\" CASCADE;' from pg_tables WHERE schemaname = 'public';" | grep DROP | awk 'NR>1{print $0}' | sed "s/\"/'/g" | PGPASSWORD=$PGPASSWORD xargs -i psql -ah 127.0.0.1 $PGTABLE $PGUSER -c {} }
이 응답에 명시된 대로 필요한 모든 삭제 테이블 문을 생성하고 "를 '로 바꾸고 DB에서 실행합니다.
아마도 가장 간단한 방법은 다음과 같습니다.
Drop 데이터베이스에는 다음이 포함된 테이블이 포함되어 있습니다.
drop database DATABASE_NAME;
해당 데이터베이스를 다시 만듭니다.
create database DATABASE_NAME;
준비된 쿼리는 다음과 같습니다.
선택하다
'drop table if exists "' || tablename || '" cascade;' as pg_drop
에서
pg_tables
어디
schemaname='your schema';
맥OS용. PostgreSQL 애플리케이션을 통한 터미널이 있는 경우 간단한 명령으로 다음을 수행할 수 있습니다.
drop table "organisations" cascade;
출처 : http:www.stackoverflow.com/questions/3327312/how-can-i-drop-all-the-tables-in-a-postgresql-database
특정 속성에 대한 LINQ의 Distinct() (0) | 2023.04.24 |
---|---|
NaN 값을 어떻게 확인할 수 있습니까? (0) | 2023.04.24 |
SOAP 대 REST(차이점) (0) | 2023.04.24 |
문자열에서 공백을 어떻게 트리밍합니까? (0) | 2023.04.24 |
병합을 완료하지 않았습니다(MERGE_HEAD 존재). (1) | 2023.04.24 |