J'essaie d'automatiser un ensemble de procédures qui créent des bases de données TEMPLATE.
J'ai un ensemble de fichiers (fichier1, fichier2, ... fichierN) contenant chacun un ensemble de commandes pgsql nécessaires à la création d'une base de données TEMPLATE.
Le contenu du fichier (createdbtemplate1.sql) ressemble à peu près à ceci:
CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8';
\c mytemplate1
CREATE TABLE first_table (
--- fields here ..
);
-- Add C language extension + functions
\i db_funcs.sql
Je veux être capable d'écrire un script Shell qui exécutera les commandes du fichier, afin de pouvoir écrire un script comme celui-ci:
# run commands to create TEMPLATE db mytemplate1
# ./groksqlcommands.sh createdbtemplate1.sql
for dbname in foo foofoo foobar barbar
do
# Need to simply create a database based on an existing template in this script
psql CREATE DATABASE $dbname TEMPLATE mytemplate1
done
Des suggestions sur la façon de faire ceci? (Comme vous l'avez peut-être deviné, je suis un débutant dans les scripts de Shell.)
Pour clarifier davantage la question, je veux savoir:
Tout d’abord, faites not mélangez les méta-commandes psql
et les commandes SQL
. Ce sont des ensembles séparés de commandes. Il existe des astuces pour les combiner (en utilisant les méta-commandes psql \o
et \\
et en transmettant des chaînes à psql dans le shell), mais évitez-le si vous le pouvez.
Je suppose que vous travaillez en tant qu'utilisateur système postgres
et que vous avez postgres
en tant que superutilisateur Postgres. Toutes les bases de données du même cluster de base de données sur le port par défaut 5432 et l'utilisateur postgres
ont un accès sans mot de passe en raison d'un paramètre IDENT
dans pg_hba.conf
(paramètres par défaut).
psql postgres -c "CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8'
TEMPLATE template0"
Je base le nouveau modèle de base de données sur le modèle de système db template0
. Lire plus à ce sujet ici .
Ta question:
Comment (...) exécuter un ensemble de cmds pgsql à partir d'un fichier
Essayer:
psql mytemplate1 -f file
Exemple pour batch:
#! /bin/sh
for file in /path/to/files/*; do
psql mytemplate1 -f "$file"
done
L'option de commande -f
permet à psql
d'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 myDB TEMPLATE mytemplate1'
L'option de commande -c
permet à psql
d'exécuter une seule chaîne de commande SQL. Peut être plusieurs commandes, terminées par ;
- seront exécutées dans une transaction et seul le résultat de la dernière commande retourné.
Lisez à propos de options de commande psql dans le manuel .
Si vous ne fournissez pas de base de données à laquelle vous connecter, psql
utilisera la base de données de maintenance par défaut nommée postgres
. Dans la deuxième réponse, la base de données à laquelle nous nous connectons n'a pas d'importance.
vous pouvez echo
vos commandes sur l'entrée psql:
for dbname in foo foofoo foobar barbar
do
echo """
CREATE DATABASE $dbname TEMPLATE mytemplate1
""" | psql
done
Si vous êtes prêt à faire un effort supplémentaire, vous aurez probablement plus de succès avec sqlalchemy . Cela vous permettra de construire des scripts avec python au lieu de bash, ce qui est plus facile et a un meilleur contrôle.
Comme demandé dans les commentaires: https://github.com/srathbun/sqlCmd