¿Hay alguna manera de exportar una base de datos PostgreSQL y luego importarla con otro nombre?
Estoy usando PostgreSQL con Rails y, a menudo, exporto los datos de producción, donde la base de datos se llama blah_production y la importo en desarrollo o puesta en escena con los nombres blah_development y blah_staging. En MySQL esto es trivial ya que la exportación no tiene la base de datos en ningún lado (excepto un comentario tal vez), pero en PostgreSQL parece ser imposible. ¿Es imposible?
Actualmente estoy volcando la base de datos de esta manera:
pg_dump blah > blah.dump
No estoy usando las opciones -c o -C. Ese volcado contiene declaraciones como:
COMMENT ON DATABASE blah IS 'blah';
ALTER TABLE public.checks OWNER TO blah;
ALTER TABLE public.users OWNER TO blah;
Cuando trato de importar con
psql blah_devel < blah.dump
yo obtengo
WARNING: database "blah" does not exist
ERROR: role "blah" does not exist
¿Quizás el problema no es realmente la base de datos sino el rol?
Si lo vuelco de esta manera:
pg_dump --format=c blah > blah.dump
e intente importarlo de esta manera:
pg_restore -d blah_devel < tmp/blah.psql
Recibo estos errores:
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
¿Algunas ideas?
He visto por ahí a algunas personas que usan scripts sed para modificar el volcado. Me gustaría evitar esa solución, pero si no hay otra alternativa, la tomaré. ¿Alguien ha escrito un script para alterar el nombre de la base de datos del volcado para garantizar que nunca se alteren los datos?