PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Script della shell per eseguire i comandi pgsql nei file

Prima di tutto, non mescola psql meta-comandi e SQL comandi. Questi sono insiemi separati di comandi. Ci sono trucchi per combinarli (usando i meta-comandi psql \o e \\ e piping stringhe su psql nella shell), ma questo diventa rapidamente confuso.

  • Fai in modo che i tuoi file contengano solo comandi SQL.
  • Non includere il CREATE DATABASE istruzione nei file SQL. Crea il db separatamente, ne hai multipli file che desideri eseguire nello stesso db modello.

Supponendo stai operando come utente del sistema operativo postgres e usa il ruolo DB postgres come (predefinito) Superuser Postgres, tutti i database si trovano nello stesso cluster di database sulla porta predefinita 5432 e il ruolo postgres ha accesso senza password a causa di un IDENT impostazione in pg_hba.conf - una configurazione predefinita.

psql postgres -c "CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8'
                  TEMPLATE template0"

Ho basato il nuovo database dei modelli sul database dei modelli di sistema predefinito template0 . Nozioni di base nel manuale qui.

Le tue domande

Come (...) eseguire una serie di cmd pgsql da file

Prova:

psql mytemplate1 -f file

Esempio di file di script per batch di file in una directory:

#! /bin/sh

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

L'opzione di comando -f rende psql eseguire comandi SQL in un file.

Come creare un database basato su un modello esistente nella riga di comando

psql -c 'CREATE DATABASE my_db TEMPLATE mytemplate1'

L'opzione di comando -c rende psql eseguire una singola stringa di comando SQL. Possono essere più comandi, terminati da ; - sarà eseguito in uno transazione e viene restituito solo il risultato dell'ultimo comando.
Leggi informazioni sulle opzioni del comando psql nel manuale.

Se non fornisci un database a cui connetterti, psql si collegherà al database di manutenzione predefinito denominato "postgres". Nella seconda risposta è irrilevante a quale database ci colleghiamo.