C'è un modo per esportare un database PostgreSQL e successivamente importarlo con un altro nome?
Sto usando PostgreSQL con Rails e spesso esporto i dati dalla produzione, dove il database si chiama blah_production e li importa in fase di sviluppo o stadiazione con nomi blah_development e blah_staging. Su MySQL questo è banale poiché l'esportazione non ha il database da nessuna parte (tranne forse un commento), ma su PostgreSQL sembra impossibile. È impossibile?
Attualmente sto scaricando il database in questo modo:
pg_dump blah > blah.dump
Non sto usando le opzioni -c o -C. Tale deposito contiene dichiarazioni come:
COMMENT ON DATABASE blah IS 'blah';
ALTER TABLE public.checks OWNER TO blah;
ALTER TABLE public.users OWNER TO blah;
Quando provo a importare con
psql blah_devel < blah.dump
ottengo
WARNING: database "blah" does not exist
ERROR: role "blah" does not exist
Forse il problema non è proprio il database ma il ruolo?
Se lo scarico in questo modo:
pg_dump --format=c blah > blah.dump
e prova a importarlo in questo modo:
pg_restore -d blah_devel < tmp/blah.psql
Ottengo questi errori:
pg_restore: WARNING: database "blah" does not exist
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 1513; 1259 16435 TABLE checks blah
pg_restore: [archiver (db)] could not execute query: ERROR: role "blah" does not exist
Command was: ALTER TABLE public.checks OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1509; 1259 16409 TABLE users blah
pg_restore: [archiver (db)] could not execute query: ERROR: role "blah" does not exist
Command was: ALTER TABLE public.users OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1508; 1259 16407 SEQUENCE users_id_seq blah
pg_restore: [archiver (db)] could not execute query: ERROR: role "blah" does not exist
Command was: ALTER TABLE public.users_id_seq OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1824; 0 0 ACL public postgres
pg_restore: [archiver (db)] could not execute query: ERROR: role "postgres" does not exist
Command was: REVOKE ALL ON SCHEMA public FROM postgres;
pg_restore: [archiver (db)] could not execute query: ERROR: role "postgres" does not exist
Command was: GRANT ALL ON SCHEMA public TO postgres;
WARNING: errors ignored on restore: 11
Qualche idea?
Ho visto là fuori alcune persone che usano script sed per modificare il dump. Vorrei evitare quella soluzione, ma se non ci sono alternative la prenderò. Qualcuno ha scritto uno script per alterare il nome del database del dump per garantire che nessun dato venga mai modificato?