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.)
Um die Frage weiter zu klären, möchte ich Folgendes wissen:
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.
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.
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
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