コマンドラインから作業して、PostgreSQLのすべてのテーブルを削除するにはどうすればよいですか?
私はしていないだけで、すべてのテーブルとその中のすべてのデータ、データベース自体をドロップします。
public
、インストールされている拡張機能はすべて失われます。
コマンドラインから作業して、PostgreSQLのすべてのテーブルを削除するにはどうすればよいですか?
私はしていないだけで、すべてのテーブルとその中のすべてのデータ、データベース自体をドロップします。
public
、インストールされている拡張機能はすべて失われます。
回答:
すべてのテーブルが単一のスキーマにある場合、このアプローチは機能する可能性があります(以下のコードでは、スキーマの名前がであると想定しています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;
pg_
別のスキーマにあるため、システムテーブル(で始まるテーブルなど)は削除されないことに注意してくださいpg_catalog
。
GRANT ALL ON SCHEMA public TO public;
作成後にしたいと思うでしょう。
GRANT ALL
作成後になぜ必要なのですか?
次のようなSQLスクリプトを生成するクエリを記述できます。
select 'drop table "' || tablename || '" cascade;' from pg_tables;
または:
select 'drop table if exists "' || tablename || '" cascade;' from pg_tables;
前の文のカスケードオプションが原因で一部のテーブルが自動的に削除される場合。
さらに、コメントに記載されているように、ドロップするテーブルをスキーマ名でフィルタリングすることもできます。
select 'drop table if exists "' || tablename || '" cascade;'
from pg_tables
where schemaname = 'public'; -- or any other schema
そして、それを実行します。
栄光のCOPY + PASTEも機能します。
drop schema public cascade;
ほとんどの場合、テーブルを削除するアクセス権があります。
この執筆時点(2014年1月)で最も受け入れられた回答は次のとおりです。
drop schema public cascade;
create schema public;
これは機能しますが、パブリックスキーマを未使用の状態に復元するつもりである場合、これはタスクを完全には完了しません。pgAdmin III for PostgreSQL 9.3.1で、この方法で作成された「パブリック」スキーマをクリックして「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 Webフレームワークを使用している私にとって、前者を使用すると問題が発生しました。
<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でこれらのコマンドを発行することにも注意してください。クエリツール(虫眼鏡アイコン「Execute abritrary SQL querys」)を使用しました。または、プラグイン-> PSQLコンソールを使用することもできます。
注意
拡張機能がインストールされている場合、スキーマを削除すると拡張機能も削除されるため、インストールする必要があるものを書き留めてから、必要に応じてステートメントを実行する必要があります。例えば
CREATE EXTENSION postgis;
drop
当時create
)。9.3にアップグレードした後、2つの追加grant
が必要です。
すべてのテーブルを削除できます
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 schema
ユーザーはスキーマの所有者ではなく、テーブルの所有者であったため、このトリックを使用できませんでした。これは動作しましたが:)
EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
:これで EXECUTE format('DROP TABLE IF EXISTS %I CASCADE', quote_ident(r.tablename));
削除したいものすべてが同じユーザーによって所有されている場合は、以下を使用できます。
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-owned.html
public
スキーマはが所有していますがpostgres
、それ以外はすべて特定のユーザーが所有しているため、そのユーザーが所有するものをすべて削除すると、スキーマを除いてデータベースがクリアされます。
drop schema public cascade;
トリックを行う必要があります。
CREATE SCHEMA public;
。また、を参照してくださいstackoverflow.com/a/14286370詳細について
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メーリングリストの1つに数年前に登録された人からのものだと思います。いつ、どちらを正確に覚えていない。
とにかくすべてのテーブルを核にしたい場合は、すべてのテーブルを1つのステートメントに入れることで、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
てください。
public
スキーマを操作しない場合は、式にスキーマ名を含めることを忘れないでくださいstring_agg(quote_ident(schemaname) || '.' || quote_ident(tablename), ', ')
。テーブル名を渡すだけではありません。
このスクリプトを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]
Pythonがそれに依存しているので、それをコピーした後、インデントが正しいことを確認してください。
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 Bothは、テーブル内のすべてのデータを削除する(つまり、すべてのテーブルを切り捨てる)ために、1か月後に同様によく実行される(直接実行)ステートメントを提供しています。
あなただけのことができない場合のためにDROP SCHEMA public CASCADE;
、DROP OWNED BY current_user;
ここにトランザクションセーフ(あなたが間にそれを置くことができる、すなわち私が書いたスタンドアロンのSQLスクリプト、または何かBEGIN;
のいずれかROLLBACK;
単なるテストに出たりCOMMIT;
して、実際に行為を行います) 「すべての」データベースオブジェクトをクリーンアップします。まあ、アプリケーションが使用するデータベースで使用されているもの、または私が賢明に追加できるものはすべて次のとおりです。
CHECK
、UNIQUE
)VIEW
s(通常または具体化)public
、DB内部ではない)スキーマ「私たち」が所有:スクリプトは、「データベーススーパーユーザーではない」として実行する場合に役立ちます。スーパーユーザーはすべてをドロップできますスキーマ(ただし、本当に重要なスキーマは依然として明示的に除外されています)。ドロップされていません(いくつかは意図的です;一部は私たちのDBに例がなかったためだけです):
public
スキーマ(その中に拡張子が提供するもののためなど)これは、復元したいダンプのデータベーススキーマバージョンが異なる場合(Debianなど)に非常に役立ちます。dbconfig-common
あなたにそれを復元するデータベースより、フライウェイまたはLiquiBaseを/ DB-Manul)。
誰かが興味を持っている場合に備えて、「2つのテーブルとそれらに属するものを除くすべて」(手動でテストされた、申し訳ありませんが、退屈なシーケンス)を削除するバージョンもあります。差分は小さいです。私に連絡するか、興味があればこのリポジトリを確認してください。
-- 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()で(ClémentPrévostextensions
によって提供された)後の追加を除いて、テスト済み。9.6と12.2で集計の削除をテストし、12.2でも手順の削除をテストしました。バグ修正とさらなる改善を歓迎します!jessie-backports
DROP FUNCTION
失敗し、その逆も同様です。関数セクションを次のように変更しました:AND pp.prokind ='f' -- Function
またはAND pp.prokind ='p' -- Procedure
proisagg
集約と手順(prokind
)を処理するようにそれを適合させ(動的にチェック)、ヒントのおかげで両方をテストしました。
これは本当に興味深い質問で、複数の方法で実行できます。これがお役に立てば幸いです。
- 現在のスキーマを削除して再作成する
ここでは、一般的に、public
デフォルトでスキーマがあります。それで、私はそれをインスタンスとして使用しています。
DROP SCHEMA `public` CASCADE;
CREATE SCHEMA `public`;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
PostgreSQL 9.3以降を使用している場合は、デフォルトの許可を復元する必要がある場合もあります。
長所:
これにより、スキーマ全体がクリーンアップされ、新しいスキーマとして再作成されます。
短所:
あなたものような他のエンティティを失うことになるFunctions
、Views
、Materialized views
、など
- テーブルからすべてのテーブル名をフェッチすることを使用する
pg_tables
。
PostgreSQLは、という名前のレコードテーブルにすべてのテーブルを格納しますpg_table
。
SELECT
'DROP TABLE IF EXISTS "' || tablename || '" CASCADE;'
from
pg_tables WHERE schemaname = 'public';
ご覧のとおり、サブクエリを使用すると、スキーマからテーブル全体を削除できます。
長所:
他のデータエンティティが重要であり、スキーマからテーブルのみを削除したい場合、このアプローチは非常に役立ちます。
あなたはテーブルとシーケンスを削除する必要があります、これは私のために働いたものです
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
このコマンドを実行する前に、あなたがに/ suコマンドをsudoをする必要があるかもしれませんpostgres
、ユーザーまたは(エクスポート接続の詳細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
rake db:create
、それを実行します。あなたはスティーブの先端を行うと、コード削除することができtable_name =
、変更を", "
するために","
そして#{ tables }
foは#{tables}
以下の手順が役立つ場合があります(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;
デフォルトのテーブルタイプ「ベーステーブル」のみを尊重するため、ビューを処理することで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"
psql -d $PGDB -t --command "SELECT string_agg(sequence_name, ',') FROM information_schema.sequences WHERE sequence_schema='public' AND sequence_catalog='$PGDB'"
まあ、私はコマンドラインから作業するのが好きなので...
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
次に、aの接頭drop table
辞と;
コマンドセパレータの接尾辞として使用されます。
| egrep '_d_'
-パイプをgrep
さらにいくつか挿入すると、どのテーブルをドロップするかをより選択できます。
drop table if exists _d_psidxddlparm;
drop table if exists _d_psindexdefn;
注:書かれているように、これ\dt
により、列ヘッダーのコマンド出力の偽の行と最後の合計行が生成されます。私はgreppingでそれを回避しますが、head
およびを使用できますtail
。
他の人が以前の回答で提案したように、最も簡単な方法はパブリックスキーマを削除することです。ただし、これは良い方法ではありません。パブリックスキーマに対して何が行われたかは、忘れられて文書化されていないため、決してわかりません。また、これが将来同じように機能するかどうかもわかりません。V9では問題ありませんでしたが、V10ではすべてのユーザーがスキーマへのアクセス権を失い、再度アクセス権を付与する必要があります。そうしないと、アプリケーションが機能しなくなります。私はV11をチェックしていませんが、重要なのは、マシンからマシンへ、サイトからサイトへ、またはバージョンからバージョンへと移動するときに何が壊れるかは決して分からないということです。また、データベースにはアクセスできるが、スキーマにはアクセスできないユーザーの場合も実行できません。
プログラムでこれを行う必要がある場合は、上記の他の回答でこれをカバーできますが、上記の回答で考慮されていないことの1つは、Postgresに作業を実行させることです。以下のように-cオプションを指定してpg_dumpを使用する場合:
sudo su postgres -c "pg_dump -U postgres WhateverDB -c -f "/home/Anyone/DBBackupWhateverDB-ServerUnscheduled.sql""
これにより、すべてのテーブルを削除するSQLステートメントを含むDB復元スクリプトが作成されます。
質問する唯一の目的が復元の前にテーブルを削除することであった場合、復元が機能します。
ただし、他の目的で必要な場合は、SQLスクリプトからdropステートメントをコピーするだけです。