Wie kann ich alle Tabellen in PostgreSQL über die Kommandozeile löschen?
I nicht die Datenbank selbst löschen möchten, nur alle Tabellen und alle darin enthaltenen Daten.
Wie kann ich alle Tabellen in PostgreSQL über die Kommandozeile löschen?
I nicht die Datenbank selbst löschen möchten, nur alle Tabellen und alle darin enthaltenen Daten.
Wenn Sie die prozedurale Sprache PL/PGSQL verwenden installiert können Sie wie folgt vorgehen, um alles ohne ein externes Shell/Perl-Skript zu entfernen.
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();
Anstatt dies an der "psql"-Eingabeaufforderung einzugeben, würde ich vorschlagen, dass Sie es in eine Datei kopieren und die Datei dann mit den Optionen "--file" oder "-f" als Eingabe an psql übergeben:
psql -f clean_all_pg.sql
Ehre, wem Ehre gebührt: Ich habe die Funktion geschrieben, aber ich glaube, die Abfragen (oder zumindest die erste) stammen von jemandem aus einer der pgsql-Mailinglisten vor Jahren. Ich weiß nicht mehr genau, wann oder auf welcher.
Wenn Sie ohnehin alle Tabellen vernichten wollen, können Sie auf Feinheiten wie CASCADE verzichten, indem Sie alle Tabellen in eine einzige Anweisung packen. Das macht die Ausführung auch schneller.
SELECT 'TRUNCATE TABLE ' || string_agg('"' || tablename || '"', ', ') || ';'
FROM pg_tables WHERE schemaname = 'public';
Direktes Ausführen:
DO $$
DECLARE tablenames text;
BEGIN
tablenames := string_agg('"' || tablename || '"', ', ')
FROM pg_tables WHERE schemaname = 'public';
EXECUTE 'TRUNCATE TABLE ' || tablenames;
END; $$
Ersetzen Sie TRUNCATE
con DROP
wie zutreffend.
Nur für den Fall... Einfaches Python-Skript, das die Postgresql-Datenbank bereinigt
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]
Stellen Sie sicher, dass die Einrückung nach dem Kopieren richtig ist, da Python sich darauf verlässt.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.