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:

  1. Comment écrire groksqlcommands.sh (un script bash qui exécutera un ensemble de CMD pgsql à partir du fichier)
  2. Comment créer une base de données basée sur un modèle existant sur la ligne de commande
22
demandé sur jww 2011-12-21 22:41:26

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.

38
répondu Erwin Brandstetter 2011-12-24 19:12:52

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
3
répondu elias 2011-12-21 18:59:08

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

1
répondu Spencer Rathbun 2011-12-22 14:09:49

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

0
répondu Yordan Georgiev 2017-03-30 19:30:47