web-dev-qa-db-fra.com

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

Modifier

Pour clarifier davantage la question, je veux savoir:

  1. Comment écrire groksqlcommands.sh (un script bash qui exécutera un ensemble de cmds pgsql à partir d'un fichier)
  2. Comment créer une base de données basée sur un modèle existant en ligne de commande
26

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.

  • Assurez-vous 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 à exécuter dans le même modèle de base de données.

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.

42
Erwin Brandstetter

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
3
elias

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

1
Spencer Rathbun

Stockez vos scripts sql dans un répertoire racine. Utilisez les fichiers dev, tst, prd paramétrés Utilisez find pour exécuter tous vos scripts pgsql comme indiqué ici Quitter en cas d'erreur

Ou simplement git clone tout l'outil de ici

0
Yordan Georgiev