Ten eerste, doe niet mix psql
meta-opdrachten en SQL
commando's. Dit zijn afzonderlijke reeksen opdrachten. Er zijn trucs om die te combineren (met behulp van de psql-meta-commando's \o
en \\
en piping strings naar psql in de shell), maar dat wordt al snel verwarrend.
- Zorg ervoor dat uw bestanden alleen SQL-commando's bevatten.
- Voeg de
CREATE DATABASE
niet toe statement in de SQL-bestanden. Maak de db apart aan, je hebt meerdere bestanden die u wilt uitvoeren in dezelfde sjabloon db.
Aangenomen je werkt als OS-gebruiker postgres
en gebruik de DB-rol postgres
als (standaard) Postgres-superuser bevinden alle databases zich in hetzelfde DB-cluster op de standaardpoort 5432 en de rol postgres
heeft wachtwoordloze toegang dankzij een IDENT
instelling in pg_hba.conf
- een standaardinstelling.
psql postgres -c "CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8'
TEMPLATE template0"
Ik heb de nieuwe sjabloondatabase gebaseerd op de standaard systeemsjabloondatabase template0
. Basisprincipes in de handleiding hier.
Uw vragen
Hoe (...) een set pgsql-cmds uit een bestand uitvoeren
Probeer:
psql mytemplate1 -f file
Voorbeeld scriptbestand voor batch bestanden in een map:
#! /bin/sh
for file in /path/to/files/*; do
psql mytemplate1 -f "$file"
done
De opdrachtoptie -f
maakt psql
voer SQL-commando's uit in een bestand.
Een database maken op basis van een bestaande sjabloon op de opdrachtregel
psql -c 'CREATE DATABASE my_db TEMPLATE mytemplate1'
De opdrachtoptie -c
maakt psql
voer een enkele SQL-opdrachtreeks uit. Kunnen meerdere commando's zijn, beëindigd door ;
- wordt uitgevoerd in één transactie en alleen het resultaat van de laatste opdracht wordt geretourneerd.
Lees over de psql-opdrachtopties in de handleiding.
Als u geen database opgeeft om verbinding mee te maken, psql
zal verbinding maken met de standaard onderhoudsdatabase met de naam "postgres". In het tweede antwoord is het niet relevant met welke database we verbinding maken.