Först och främst, gör inte blanda psql
metakommandon och SQL
kommandon. Dessa är separata uppsättningar kommandon. Det finns knep för att kombinera dessa (med psql-metakommandona \o
och \\
och piping strängar till psql i skalet), men det blir snabbt förvirrande.
- Låt dina filer bara innehålla SQL-kommandon.
- Inkludera inte
CREATE DATABASE
uttalande i SQL-filerna. Skapa db separat, du har flera filer du vill köra i samma mall db.
Förutsatt du arbetar som OS-användare postgres
och använd DB-rollen postgres
som (standard) Postgres superanvändare är alla databaser i samma DB-kluster på standardporten 5432 och rollen postgres
har lösenordslös åtkomst på grund av en IDENT
inställning i pg_hba.conf
- en standardinställning.
psql postgres -c "CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8'
TEMPLATE template0"
Jag baserade den nya malldatabasen på standardsystemmalldatabasen template0
. Grunderna i manualen här.
Dina frågor
Hur man (...) kör en uppsättning pgsql cmds från filen
Försök:
psql mytemplate1 -f file
Exempel skriptfil för batch av filer i en katalog:
#! /bin/sh
for file in /path/to/files/*; do
psql mytemplate1 -f "$file"
done
Kommandoalternativet -f
gör psql
exekvera SQL-kommandon i en fil.
Hur man skapar en databas baserad på en befintlig mall på kommandoraden
psql -c 'CREATE DATABASE my_db TEMPLATE mytemplate1'
Kommandoalternativet -c
gör psql
exekvera en enda SQL-kommandosträng. Kan vara flera kommandon, avslutade med ;
- kommer att köras i ett transaktion och endast resultatet av det senaste kommandot som returnerades.
Läs om psql-kommandoalternativ i manualen.
Om du inte tillhandahåller en databas att ansluta till, psql
kommer att ansluta till standardunderhållsdatabasen med namnet "postgres". I det andra svaret är det irrelevant vilken databas vi ansluter till.