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 DATABASEniet 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.