Tout d'abord, ne faites pas mélanger psql
méta-commandes et SQL
commandes. Ce sont des ensembles de commandes distincts. Il existe des astuces pour les combiner (en utilisant les méta-commandes psql \o
et \\
et les chaînes de tuyauterie vers psql dans le shell), mais cela devient rapidement déroutant.
- Faites en sorte que vos fichiers contiennent uniquement des commandes SQL.
- N'incluez pas le
CREATE DATABASE
déclaration dans les fichiers SQL. Créez la base de données séparément, vous en avez plusieurs fichiers que vous souhaitez exécuter dans le même modèle de base de données.
En supposant vous opérez en tant qu'utilisateur du système d'exploitation postgres
et utilisez le rôle DB postgres
en tant que superutilisateur Postgres (par défaut), toutes les bases de données sont dans le même cluster de bases de données sur le port par défaut 5432 et le rôle postgres
a un accès sans mot de passe grâce à un IDENT
réglage dans pg_hba.conf
- une configuration par défaut.
psql postgres -c "CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8'
TEMPLATE template0"
J'ai basé la nouvelle base de données de modèles sur la base de données de modèles système par défaut template0
. Les bases dans le manuel ici.
Vos questions
Comment (...) exécuter un ensemble de cmds pgsql à partir d'un fichier
Essayez :
psql mytemplate1 -f file
Exemple de fichier de script pour un lot de fichiers dans un répertoire :
#! /bin/sh
for file in /path/to/files/*; do
psql mytemplate1 -f "$file"
done
L'option de commande -f
rend psql
exécuter des commandes SQL dans un fichier.
Comment créer une base de données basée sur un modèle existant en ligne de commande
psql -c 'CREATE DATABASE my_db TEMPLATE mytemplate1'
L'option de commande -c
rend psql
exécuter une seule chaîne de commande SQL. Peut être plusieurs commandes, terminées par ;
- sera exécuté en un transaction et seul le résultat de la dernière commande est renvoyé.
Lisez les options de la commande psql dans le manuel.
Si vous ne fournissez pas de base de données à laquelle vous connecter, psql
se connectera à la base de données de maintenance par défaut nommée "postgres". Dans la deuxième réponse, peu importe la base de données à laquelle nous nous connectons.