PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Shell-Skript zum Ausführen von pgsql-Befehlen in Dateien

Zunächst einmal nicht mix psql Meta-Befehle und SQL Befehle. Dies sind separate Befehlssätze. Es gibt Tricks, um diese zu kombinieren (mit den psql-Metabefehlen \o und \\ und Strings an psql in der Shell übergeben), aber das wird schnell verwirrend.

  • Stellen Sie sicher, dass Ihre Dateien nur SQL-Befehle enthalten.
  • Schließen Sie CREATE DATABASE nicht ein Anweisung in den SQL-Dateien. Erstellen Sie die Datenbank separat, Sie haben mehrere Dateien, die Sie ausführen möchten, in derselben Vorlagendatenbank.

Angenommen Sie arbeiten als OS-Benutzer postgres und verwenden Sie die DB-Rolle postgres Als (Standard-) Postgres-Superuser befinden sich alle Datenbanken im selben DB-Cluster auf dem Standardport 5432 und der Rolle postgres hat passwortlosen Zugriff durch einen IDENT Einstellung in pg_hba.conf - eine Standardeinstellung.

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

Ich habe die neue Vorlagendatenbank auf der Standard-Systemvorlagendatenbank template0 basiert . Grundlagen im Handbuch hier.

Ihre Fragen

Wie man (...) eine Reihe von pgsql cmds aus einer Datei ausführt

Versuchen Sie:

psql mytemplate1 -f file

Beispielskriptdatei für Stapel von Dateien in einem Verzeichnis:

#! /bin/sh

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

Die Befehlsoption -f macht psql SQL-Befehle in einer Datei ausführen.

So erstellen Sie eine Datenbank basierend auf einer vorhandenen Vorlage auf der Befehlszeile

psql -c 'CREATE DATABASE my_db TEMPLATE mytemplate1'

Die Befehlsoption -c macht psql Ausführen einer einzelnen SQL-Befehlszeichenfolge. Kann aus mehreren Befehlen bestehen, die durch ; abgeschlossen werden - wird in einem ausgeführt Transaktion und nur das Ergebnis des letzten zurückgegebenen Befehls.
Lesen Sie mehr über psql-Befehlsoptionen im Handbuch.

Wenn Sie keine Datenbank zum Herstellen einer Verbindung bereitstellen, psql stellt eine Verbindung zur standardmäßigen Wartungsdatenbank mit dem Namen "postgres" her. Bei der zweiten Antwort ist es unerheblich, zu welcher Datenbank wir uns verbinden.