Як я можу скинути всі таблиці в 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
А потім запустіть його.
Також спрацює славна КОПІЯ + ПАСТА.
drop schema public cascade;
, але ти майже завжди маєш дозволи на викидання таблиць.
Найбільш прийнятою відповіддю на цей текст (січень 2014 року) є:
drop schema public cascade;
create schema public;
Це спрацьовує, однак якщо ваш намір відновити загальнодоступну схему до її незайманого стану, це не повністю виконає завдання. У розділі pgAdmin III для PostgreSQL 9.3.1, якщо ви натиснете на створену таким чином схему "public" і подивіться на "панель 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';
Для мене за допомогою веб-фрейма python, яка створює таблиці баз даних (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';
Також зауважте, щоб видавати ці команди в pgAdmin III, я використовував інструмент "Запит" (піктограма лупи "Виконати abritrar SQL запити") або ви можете використовувати додатки-> PSQL консоль
Примітка
Якщо у вас встановлені будь-які розширення, вони будуть скинуті, коли ви скинете схему, тож слід зауважити, що вам потрібно встановити, а потім виконати оператори за необхідності. Напр
CREATE EXTENSION postgis;
drop
тоді create
) використовувалося для роботи над PostgreSQL 9.1. Після оновлення до 9.3 необхідні два додаткові 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
, але все інше належить конкретному користувачеві, тому випадання всього, що належить цьому користувачеві, очищає базу даних, за винятком схеми.
Згідно з Пабло вище, щоб просто відмовитися від конкретної схеми, щодо випадку:
select 'drop table "' || tablename || '" cascade;'
from pg_tables where schemaname = 'public';
where schemaname='public'
роль значна?
drop schema public cascade;
повинен зробити трюк.
CREATE SCHEMA public;
. Також дивіться stackoverflow.com/a/14286370 для отримання додаткової інформації
Слідом за Пабло та Лену, ось однокласник, який робить все як підготовкою, так і виконанням:
psql -U $PGUSER $PGDB -t -c "select 'drop table \"' || tablename || '\" cascade;' from pg_tables where schemaname = 'public'" | psql -U $PGUSER $PGDB
Примітка: встановіть або замініть $PGUSER
і $PGDB
з потрібними значеннями
Якщо у вас є 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", я б запропонував вам скопіювати його у файл, а потім передати його як вхід до psql, використовуючи параметри "--file" або "-f":
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
як це може бути застосовано.
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; $$
Про всяк випадок ... Простий скрипт Python, який очищає базу даних Postgresql
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. З баш сценарію:
#!/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
або внутрішні БД) схеми "ми" володіємо: сценарій корисний, коли він працює як "не суперпользователь базы данных"; суперрусер може скинути всі схеми (хоча справді важливі з них явно виключені)Не випадають (деякі навмисні; деякі лише тому, що я не мав прикладу в нашій БД):
public
схеми (наприклад , для розширення наданого матеріалу в них)Це дійсно корисно у випадках, коли дамп, який ви хочете відновити, має іншу версію схеми бази даних (наприклад, з Debiandbconfig-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; $$;
Тестовано, окрім пізніших доповнень ( extensions
внесених Clément Prévost ), на PostgreSQL 9.6 ( jessie-backports
). Видалення сукупності тестовано на 9.6 та 12.2, а також видалення процедури перевірено на 12.2. Виправлення помилок та подальші вдосконалення вітаються!
DROP FUNCTION
відмова від процедури та навпаки. Я змінив розділ функції на це: AND pp.prokind ='f' -- Function
абоAND pp.prokind ='p' -- Procedure
proisagg
) на ≤ 10.x та агрегатів та процедур ( prokind
) на ≥ 11 (перевірено динамічно) і протестував обидва ☻ дякую за підказку.
Це дійсно цікаве запитання, і ви зможете його виконати кількома способами. Я сподіваюся, що вам це стане в нагоді.
- Відмовившись і відтворивши поточну схему
Тут загалом у нас є 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
Перед виконанням команди вам може знадобитися SUDO / су на postgres
користувача або (експорт з'єднання деталей PGHOST
, PGPORT
, PGUSER
і PGPASSWORD
) , а потімexport PGDATABASE=yourdatabase
Завдання Rake для Rails для знищення всіх таблиць у поточній базі даних
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
я запускаю його. Ви можете зробити Steve наконечник і видалити код table_name =
і зміни ", "
для ","
і #{ tables }
Ф.О.#{tables}
Я вдосконалив метод bash від jamie, піклуючись про погляди, тому що його тільки шанує тип таблиці "базовий стіл", який є типовим.
наступний код 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'"
Наступні кроки можуть бути корисними (для користувачів 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;
добре, оскільки мені подобається працювати з командного рядка ...
psql -U <user> -d <mydb> -c '\dt' | cut -d ' ' -f 4 | sed -e "s/^/drop table if exists /" | sed -e "s/$/;/"
-c '\dt'
буде викликати команду таблиць списку.
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
команд, що виводять заголовки стовпців та загальні рядки в кінці. Я уникаю цього, хапаючи, але ви могли б використовувати head
і tail
.
Найпростіший спосіб - відкинути загальнодоступну схему, як пропонували інші у попередніх відповідях. Однак це НЕ хороший спосіб. Ніколи не знаєш, що було зроблено з публічною схемою, яка з тих пір була забута і не була задокументована. Ви також не знаєте, чи буде це працювати так само і в майбутньому. У V9 це було б добре, але в V10 всі ваші користувачі втратять доступ до схеми, і йому знову потрібно надати доступ, інакше ваша програма порушиться. Я не перевіряв V11, але справа в тому, що ти ніколи не знаєш, що зламається, коли ти переходиш від машини до машини, сайту на сайт або від версії до версії. Це також неможливо зробити, якщо ви користувач, який має доступ до бази даних, але не до схеми.
Якщо вам потрібно зробити це програмно, то інші відповіді вище висвітлюють це, але одне, що відповіді вище не враховує, це змусити Postgres зробити роботу за вас. Якщо ви використовуєте pg_dump з опцією -c, як показано нижче:
sudo su postgres -c "pg_dump -U postgres WhateverDB -c -f "/home/Anyone/DBBackupWhateverDB-ServerUnscheduled.sql""
Це створить сценарій відновлення БД з операторами sql, які видалять усі таблиці.
Якщо єдиною метою задавати питання було видалити таблиці перед відновленням, то відновлення зробить роботу за вас.
Однак якщо вам це потрібно для чогось іншого, ви можете просто скопіювати заяви про падіння із скрипту sql.