Script Shell pour exécuter des commandes pgsql dans des fichiers
J'essaie d'automatiser un ensemble de procédures qui créent des bases de données de modèles.
J'ai un ensemble de fichiers (fichier1, fichier2, ... fileN), chacune contenant un ensemble de commandes pgsql nécessaires à la création d'une base de données de modèles.
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 pouvoir écrire un script shell qui exécutera les commandes dans le fichier, afin que je puisse écrire un script comme ceci:
# 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
Toutes les suggestions comment faire cela? (Comme vous l'avez peut-être deviné, je suis un débutant de script shell.)
Modifier
Pour clarifier la question plus loin, je veux savoir:
- Comment écrire groksqlcommands.sh (un script bash qui exécutera un ensemble de CMD pgsql à partir du fichier)
- Comment créer une base de données basée sur un modèle existant sur la ligne de commande
4 réponses
Tout d'Abord, do pas mélanger psql
méta-commandes et SQL
commandes. Ce sont des ensembles distincts de commandes. Il y a des astuces pour les combiner (en utilisant les méta-commandes psql \o
et \\
et les chaînes de tuyauterie à psql dans le shell), mais restez à l'écart si vous le pouvez.
- faites en sorte que vos fichiers ne contiennent que des commandes SQL.
- n'incluez pas L'instruction CREATE DATABASE dans les fichiers SQL. Créez la base de données séparément, vous avez plusieurs fichiers que vous souhaitez exécuter dans le même modèle db.
Je suppose que vous opérez en tant qu'utilisateur système postgres
et que vous avez postgres
en tant que superutilisateur Postgres. Toutes les bases de données dans le même cluster de base de données sur le port par défaut 5432 et l'utilisateur postgres
a 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 db sur le modèle système db template0
. Lire plus à ce sujet ici.
Votre question:
Comment (...) exécuter un ensemble de CMD pgsql à partir du fichier
Essayer:
psql mytemplate1 -f file
Exemple pour le lot:
#! /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 sur la 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 seulement le résultat de la dernière la commande retournée.
Lisez les options de commande psql dans le manuel .
Si vous ne fournissez pas de base de données à laquelle vous vous connectez, psql
utilisera la base de données de maintenance par défaut nommée postgres
. Dans la deuxième réponse, il n'est pas pertinent de savoir à quelle base de données nous nous connectons.
Vous pouvez echo
vos commandes à 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 à aller plus loin, 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.
Tel Que demandé dans les commentaires: https://github.com/srathbun/sqlCmd
Stockez vos scripts sql sous un répertoire racine Utiliser dev, tst, prd paramétré dbs Utilisez find pour exécuter tous vos scripts pgsql comme indiqué ici Quitter sur les erreurs
Ou simplement git cloner l'outil entier à partir de ici