PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Shell script para executar comandos pgsql em arquivos


Em primeiro lugar, não misturar psql meta-comandos e SQL comandos. Estes são conjuntos separados de comandos. Existem truques para combiná-los (usando os meta-comandos do psql \o e \\ e canalizando strings para o psql no shell), mas isso fica confuso rapidamente.
  • Faça com que seus arquivos contenham apenas comandos SQL.
  • Não inclua o CREATE DATABASE instrução nos arquivos SQL. Crie o banco de dados separadamente, você tem múltiplos arquivos que você deseja executar no mesmo modelo de banco de dados.

Supondo você está operando como usuário do SO postgres e use a função de banco de dados postgres como superusuário Postgres (padrão), todos os bancos de dados estão no mesmo cluster de banco de dados na porta padrão 5432 e na função postgres tem acesso sem senha devido a um IDENT configuração em pg_hba.conf - uma configuração padrão.
psql postgres -c "CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8'
                  TEMPLATE template0"

Eu baseei o novo banco de dados de modelo no banco de dados de modelo de sistema padrão template0 . Noções básicas no manual aqui.

Suas perguntas


Como (...) executar um conjunto de cmds pgsql do arquivo

Experimentar:
psql mytemplate1 -f file

Exemplo de arquivo de script para lote de arquivos em um diretório:
#! /bin/sh

for file in /path/to/files/*; do
    psql mytemplate1 -f "$file"
done

A opção de comando -f faz psql executar comandos SQL em um arquivo.

Como criar um banco de dados com base em um modelo existente na linha de comando
psql -c 'CREATE DATABASE my_db TEMPLATE mytemplate1'

A opção de comando -c faz psql executar uma única cadeia de comando SQL. Podem ser vários comandos, terminados por ; - será executado em um transação e somente o resultado do último comando retornado.
Leia sobre as opções de comando psql no manual.

Se você não fornecer um banco de dados para se conectar, psql irá se conectar ao banco de dados de manutenção padrão chamado "postgres". Na segunda resposta, é irrelevante a qual banco de dados nos conectamos.