@ टोमेट्ज़की का समाधान बिल्कुल सही नहीं है, कम से कम 9.2 के pg_dump
के साथ . यह नए स्कीमा में तालिका बनाएगा, लेकिन pg_dump
स्कीमा-योग्यता ALTER TABLE ... OWNER TO
बयान, इसलिए वे विफल हो जाएंगे:
postgres=# CREATE DATABASE demo;
\cCREATE DATABASE
postgres=# \c demo
You are now connected to database "demo" as user "postgres".
demo=# CREATE TABLE public.test ( dummy text );
CREATE TABLE
demo=# \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | test | table | postgres
(1 row)
demo=# \q
$
$ pg_dump -U postgres -f demo.sql demo
$ sed -i 's/^SET search_path = public, pg_catalog;$/SET search_path = testschema, pg_catalog;/' demo.sql
$ grep testschema demo.sql
SET search_path = testschema, pg_catalog;
$ dropdb -U postgres demo
$ createdb -U postgres demo
$ psql -U postgres -c 'CREATE SCHEMA testschema;' demo
CREATE SCHEMA
$ psql -U postgres -f demo.sql -v ON_ERROR_STOP=1 -v QUIET=1 demo
psql:demo.sql:40: ERROR: relation "public.test" does not exist
$ psql demo
demo=> \d testschema.test
Table "testschema.test"
Column | Type | Modifiers
--------+------+-----------
dummy | text |
आपको public.test
. पर स्कीमा-योग्यता को हटाने के लिए डंप को संपादित करने की भी आवश्यकता होगी या इसे नए स्कीमा नाम में बदलें। sed
इसके लिए एक उपयोगी उपकरण है।
मैं शपथ ले सकता था कि ऐसा करने का सही तरीका pg_dump -Fc -n public -f dump.dbbackup
था। फिर pg_restore
एक नई स्कीमा में, लेकिन मुझे यह पता नहीं लग रहा है कि अभी कैसे ठीक है।
अपडेट करें:नहीं, ऐसा लगता है कि sed
आपकी सबसे अच्छी शर्त है। देखें