Conecte-se ao PgSQL, DROP existente DB, recrie-o usando CREATE e execute algumas consultas sozinhas e a partir de arquivos usando o script Bash

0

Preciso de alguns conselhos para criar um script para me ajudar com tarefas repetitivas que faço o tempo todo em um ambiente de desenvolvimento. Eu tenho um servidor PostgreSQL e desde que eu estou desenvolvendo um aplicativo da web eu preciso soltar, criar e preencher algumas tabelas o tempo todo e isso é um processo tedioso. Então eu preciso construir algum tipo de script para me ajudar nisso. Basicamente, são as tarefas repetitivas que faço o tempo todo, a partir de uma interface gráfica do pgAdmin:

#!/bin/sh
psql -u postgres -w  // this line should connect to PostgreSQL asking for a password since I not found other way to pass the password on that line

DROP DATABASE sis_db; // drop the DB

CREATE DATABASE sis_db WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1; // create the DB

// Create some schemas on the DB ( I don't know if I should select the DB first)
CREATE SCHEMA nomencladores AUTHORIZATION postgres;
CREATE SCHEMA negocio AUTHORIZATION postgres;
CREATE SCHEMA usuarios_externos AUTHORIZATION postgres;

E, finalmente, devo carregar cerca de 10% dos arquivos.sql, mas não sei se -filename permite mais de um arquivo no momento. Eu preciso de alguns conselhos sobre este script bash desde que eu não sei como consegui-lo, pode me dar alguma ajuda?

Atualização: primeira abordagem de script

Ok, fazendo uma pesquisa profunda, eu uso essa solução que funciona, mas sinto falta de algumas coisas que preciso também. Eu fiz este script:

#!/bin/sh

# kill all connections to the postgres server
echo "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity where pg_stat_activity.datname='sis_db';" | psql -U postgres -w

# drop the DB
echo "DROP DATABASE sis_db;" | psql -U postgres -w

# create the DB
echo "CREATE DATABASE sis_db WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1;" | psql -U postgres -w

# create schemas
echo "CREATE SCHEMA nomencladores AUTHORIZATION postgres;" | psql -U postgres -d sis_db -w
echo "CREATE SCHEMA negocio AUTHORIZATION postgres;" | psql -U postgres -d sis_db -w
echo "CREATE SCHEMA usuarios_externos AUTHORIZATION postgres;" | psql -U postgres -d sis_db -w

Ele usará um arquivo /root/.pgpass que eu criei e configurei. O script agora está funcionando como eu quero, mas o que eu não sei é como adicionar vários arquivos ao mesmo tempo, ou seja, após a criação de esquemas, executar o conteúdo de sql1.sql , sql2.sql e assim por diante, qualquer ajuda ou conselho?

    
por ReynierPM 14.11.2014 / 01:54

1 resposta

1

Aqui está um esqueleto que pode ser usado diretamente em um script bash:

#!/bin/sh
psql -U postgres << END_OF_SCRIPT

DROP DATABASE sis_db; -- drop the DB

CREATE DATABASE sis_db WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1;

\c sis_db

-- Create some schemas on the DB

CREATE SCHEMA nomencladores AUTHORIZATION postgres;
CREATE SCHEMA negocio AUTHORIZATION postgres;
CREATE SCHEMA usuarios_externos AUTHORIZATION postgres;

END_OF_SCRIPT

Alguns comentários:

  • -u não funcionaria, são -U , as opções diferenciam maiúsculas e minúsculas.

  • CREATE DATABASE não se conecta automaticamente ao novo banco de dados, \c sis_db faz e é a única maneira de os objetos criados posteriormente no script pertencerem a esse banco de dados.

  • comentários de fim de linha começam com -- no SQL, não //

  • A opção --file não pode ser usada várias vezes na linha de comando, apenas a última será honrada. No entanto, \i fileN.sql de dentro de psql pode ser usado para incluir uma série de arquivos.

  • tenha cuidado com os erros. Por padrão, um script continuará após um erro, possivelmente causando efeitos indesejáveis, como a criação de objetos no banco de dados incorreto. Isso pode ser evitado com -vON_ERROR_STOP=1 na linha de comando do psql ou \set ON_ERROR_STOP on dentro do script.

  • Verifique a página de manual do psql, isso explica tudo isso e muito mais.

por 14.11.2014 / 02:52