PostgreSQL में सभी टेबल ड्रॉप करें?




(14)

आप इस तरह एक एसक्यूएल स्क्रिप्ट उत्पन्न करने के लिए एक क्वेरी लिख सकते हैं:

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

और फिर इसे चलाओ।

शानदार कॉपी + PASTE भी काम करेगा।

मैं कमांड लाइन से काम कर रहे PostgreSQL में सभी टेबल कैसे हटा सकता हूं?

मैं डेटाबेस को खुद ही नहीं छोड़ना चाहता, बस सभी टेबल और उन सभी डेटा को छोड़ना चाहता हूं।


आप ड्रॉप टेबल के लिए एक अल्पविराम से अलग सूची बनाने के लिए string_agg फ़ंक्शन का उपयोग कर सकते हैं। एक बैश स्क्रिप्ट से:

#!/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"

आपको टेबल और अनुक्रमों को छोड़ने की ज़रूरत है, यहां मेरे लिए क्या काम किया गया है

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 उपयोगकर्ता को PGHOST / सु या (निर्यात कनेक्शन विवरण PGHOST , PGPORT , PGUSER और PGPASSWORD ) की आवश्यकता हो सकती है और फिर export PGDATABASE=yourdatabase


इस लेखन के रूप में सबसे स्वीकार्य उत्तर (जनवरी 2014) है:

drop schema public cascade;
create schema public;

यह काम करता है, हालांकि यदि आपका इरादा सार्वजनिक स्कीमा को अपनी कुंवारी स्थिति में बहाल करना है, तो यह कार्य पूरी तरह से पूरा नहीं करता है। PostgreSQL 9.3.1 के लिए pgAdmin III के तहत, यदि आप इस तरह से बनाई गई "सार्वजनिक" स्कीमा पर क्लिक करते हैं और "एसक्यूएल फलक" में देखते हैं तो आप निम्न देखेंगे:

-- 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) बनाता है, पूर्व की समस्याओं का उपयोग कर:

<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 से जारी करने के लिए भी ध्यान दें, मैं प्लगइन्स-> PSQL कंसोल पर गया था)


उपरोक्त पाब्लो के अनुसार, मामले के संबंध में, केवल एक विशिष्ट स्कीमा से ड्रॉप करने के लिए:

select 'drop table "' || tablename || '" cascade;' 
from pg_tables where schemaname = '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_' | egrep '_d_' - इसे grep कुछ और पाइप करें और आप कौन सी टेबल छोड़ते हैं इसके बारे में अधिक चुनिंदा हो सकते हैं।

drop table if exists _d_psidxddlparm; drop table if exists _d_psindexdefn;

नोट: लिखित के रूप में, यह कॉलम हेडर के आउटपुट आउटपुट और अंत में कुल पंक्तियों के लिए फर्जी पंक्तियां उत्पन्न करेगा। मैं इसे पकड़ने से बचता हूं, लेकिन आप head और tail उपयोग कर सकते हैं।


पाब्लो और लेनडब्ल्यू के बाद, यहां एक-लाइनर है जो यह सब तैयार करता है और फिर निष्पादित करता है:

psql -U $PGUSER $PGDB -t -c "select 'drop table \"' || tablename || '\" cascade;' from pg_tables where schemaname = 'public'" | psql -U $PGUSER $PGDB

एनबी: या तो अपने इच्छित मूल्यों के साथ $PGUSER और $PGDB को सेट या प्रतिस्थापित करें


बस मामले में ... सरल पायथन स्क्रिप्ट जो 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]

सुनिश्चित करें कि इसे कॉपी करने के बाद इंडेंटेशन सही है क्योंकि पाइथन इस पर निर्भर करता है।


मैंने विचारों की देखभाल करके जैमी से बैश विधि को बढ़ाया क्योंकि उसका केवल तालिका प्रकार "आधार तालिका" का सम्मान करता है जो डिफ़ॉल्ट है।

निम्नलिखित बैश कोड पहले विचारों को हटा देता है और फिर बाकी सभी

#!/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"

यदि आप जो कुछ भी छोड़ना चाहते हैं वह उसी उपयोगकर्ता के स्वामित्व में है, तो आप इसका उपयोग कर सकते हैं:

drop owned by the_user;

आपको the_user को वास्तविक उपयोगकर्ता नाम से बदलना होगा, वर्तमान में "वर्तमान उपयोगकर्ता" के लिए सब कुछ छोड़ने का कोई विकल्प नहीं है। आने वाले 9 .5 संस्करण drop owned by current_user विकल्प drop owned by current_user होगी।

यह विचारों, अनुक्रमों, ट्रिगर्स और इतने पर भी ड्रॉप करेगा कि the_user का मालिक है (= बनाया गया)।

मैनुअल में अधिक जानकारी: http://www.postgresql.org/docs/current/static/sql-drop-owned.html


यदि आपकी सभी टेबल एक स्कीमा में हैं, तो यह दृष्टिकोण काम कर सकता है (नीचे कोड मानता है कि आपकी स्कीमा का नाम 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;

यदि आपके पास पीएल / पीजीएसक्यूएल प्रक्रियात्मक भाषा installed तो आप खोल / पर्ल बाहरी स्क्रिप्ट के बिना सब कुछ हटाने के लिए निम्न का उपयोग कर सकते हैं।

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 मेलिंग सूचियों में से किसी से आया था। बिल्कुल याद नहीं है कि कब या कौन सा।


विंडोज बैच फ़ाइल में:

@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
)

drop schema public cascade;

चाल करना चाहिए





postgresql