it-swarm.com.de

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

Ich versuche, eine Reihe von Prozeduren zu automatisieren, mit denen TEMPLATE-Datenbanken erstellt werden.

Ich habe eine Reihe von Dateien (file1, file2, ... fileN), die jeweils eine Reihe von pgsql-Befehlen enthalten, die zum Erstellen einer TEMPLATE-Datenbank erforderlich sind.

Der Inhalt der Datei (createdbtemplate1.sql) sieht ungefähr so ​​aus:

CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8';

\c mytemplate1

CREATE TABLE first_table ( 
 --- fields here ..
);

-- Add C language extension + functions
\i db_funcs.sql

Ich möchte in der Lage sein, ein Shell-Skript zu schreiben, das die Befehle in der Datei ausführt, sodass ich ein Skript wie folgt schreiben kann:

# run commands to create TEMPLATE db mytemplate1
# ./groksqlcommands.sh createdbtemplate1.sql

for dbname in foo foofoo foobar barbar
do
    # Need to simply create a database based on an existing template in this script
    psql CREATE DATABASE $dbname TEMPLATE mytemplate1
done

Irgendwelche Vorschläge, wie das geht? (Wie Sie vielleicht schon erraten haben, bin ich ein Neuling in der Shell-Szene.)

Bearbeiten

Um die Frage weiter zu klären, möchte ich Folgendes wissen:

  1. Wie schreibe ich groksqlcommands.sh (ein bash-Skript, das einen Satz von pgsql-cmds aus der Datei ausführt)
  2. So erstellen Sie eine Datenbank basierend auf einer vorhandenen Vorlage in der Befehlszeile
26

Führen Sie zunächst not mix psql Meta-Befehle und SQL-Befehle aus. Dies sind separate Befehlssätze. Es gibt Tricks, um diese zu kombinieren (mit den psql-Meta-Befehlen \o und \\ und Piping-Strings an psql in der Shell), aber bleiben Sie davon fern, wenn Sie können.

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

Ich gehe davon aus, dass Sie als Systembenutzer postgres arbeiten und postgres als Postgres-Superuser haben. Alle Datenbanken in demselben DB-Cluster am Standardport 5432 und der Benutzer postgres haben aufgrund einer Einstellung von IDENT in pg_hba.conf (Standardeinstellungen) Zugriff ohne Kennwort.

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

Ich stütze die neue Vorlagen-Datenbank auf der Systemvorlage-Datenbank template0. Lesen Sie mehr dazu hier .
Ihre Frage:

Wie man (...) einen Satz von pgsql cmds aus der Datei ausführt

Versuchen:

psql mytemplate1 -f file

Beispiel für die Charge:

#! /bin/sh

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

Die Befehlsoption -f lässt psql SQL-Befehle in einer Datei ausführen. 

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

psql -c 'CREATE DATABASE myDB TEMPLATE mytemplate1'

Die Befehlsoption -c bewirkt, dass psql eine einzelne SQL-Befehlszeichenfolge ausführt. Kann mehrere Befehle sein, die durch ; beendet werden - wird in der Transaktion one ausgeführt und nur das Ergebnis des letzten zurückgegebenen Befehls.
Lesen Sie mehr über psql-Befehlsoptionen im Handbuch .

Wenn Sie keine Datenbank angeben, zu der eine Verbindung hergestellt werden soll, verwendet psql die Standardwartungsdatenbank mit dem Namen postgres. In der zweiten Antwort ist es unerheblich, mit welcher Datenbank wir uns verbinden.

42

sie können echo Ihre Befehle zur Eingabe von psql hinzufügen:

for dbname in foo foofoo foobar barbar
do
    echo """
CREATE DATABASE $dbname TEMPLATE mytemplate1
""" | psql
done
3
elias

Wenn Sie bereit sind, die Extra-Meile zu gehen, haben Sie wahrscheinlich mehr Erfolg mit sqlalchemy . Damit können Sie Skripte mit Python anstelle von bash erstellen. Dies ist einfacher und bietet eine bessere Kontrolle.

Wie in den Kommentaren angefordert: https://github.com/srathbun/sqlCmd

1
Spencer Rathbun

Speichern Sie Ihre SQL-Skripts unter einem Root-Verzeichnis Verwenden Sie dev, tst, prd und parametrisierte dbs Verwenden Sie find, um alle Ihre pgsql-Skripts wie gezeigt auszuführen hier Beenden Sie Fehler

Oder git einfach das ganze Werkzeug aus hier

0
Yordan Georgiev