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