Vous appréciez mon travail ?
Je serais ravi de prendre un café !

Vous prenez du plaisir à lire mes articles ? Vous apprenez de nouvelles choses ? Je serais ravis que vous supportiez mon travail avec une petite participation

1 café Merci, vous financez ma dose quotidienne de théïne (oui, en vrai je ne bois pas de café).
5 cafés Génial, ça couvre mes frais de serveur mensuels.
10 cafés Fantastique, avec ça je peux investir dans du matériel et approfondir mes connaissances.
BazinGa's - Tips & tuto IT

Exécution automatisée de scripts SQL

J’ai récemment eu besoin de lancer diverses requêtes sous PostgreSQL. Facile me direz-vous mais il fallait répondre aux critères suivants :

  • Pouvoir lancer beaucoup de requêtes SQL (plus d’une centaine) simplement.
  • Pouvoir relancer le test a volonté.
  • Ne pas avoir à installer d’outil tiers.

Et bien avec PSQL et un fichier .bat j’ai pu mener à bien mon projet.

PSQL

Exécuter un script contenant une série d’instructions SQL est simple avec PSQL :

psql ^
  --host "127.0.0.1" ^
  --port "5432" ^
  --username "postgres" ^
  --dbname "ma_bdd" ^
  --file "C:\chemin\vers\fichier.sql"

Vous pouvez consulter la documentation PSQL en suivant ce lien.

Automatisation

Grâce à un petit fichier .bat, il est possible de simplifier le lancement de cette ligne de commande pour toute une série de fichiers SQL à exécuter.

Voici le script en question :

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion


:: Définition des variables fichier
set "sql_file_pattern=C:\chemin\vers\fichiers\sql\test_*.sql"
set "log_file_directory=C:\chemin\vers\fichiers\log"


:: Mot de passe en variable d'environnement
set "PGPASSWORD=mon_mdp"
set "pg_bin=C:\Program Files\PostgreSQL\15\bin"
set "PGCLIENTENCODING=UTF8"


:: Créer le répertoire de logs s'il n'existe pas
if not exist "%log_file_directory%" mkdir "%log_file_directory%"


:: Boucle sur tous les fichiers répondants au motif indiqué
for %%F in ("%sql_file_pattern%") do (
    set "sql_file=%%F"
    set "log_file=%log_file_directory%\%%~nF.log"

    echo Exécution du script : %%~nxF

    "%pg_bin%\psql.exe" ^
      --host "%db_host%" ^
      --port "%db_port%" ^
      --username "%db_user%" ^
      --dbname "%db_name%" ^
      --file "!sql_file!" ^
      --quiet ^
      > "!log_file!" 2>&1
)


:: Effacement du mot de passe
set "PGPASSWORD="

endlocal

Alors « OUI » le mot de passe en ici en clair mais n’hésitez pas à modifier ce script pour utiliser un fichier pgpass.conf.

Ce script va donc exécuter les requêtes présentes dans tous les fichiers correspondants au motif renseigné dans la variable sql_file_pattern.

Des fichiers de log seront générés permettant de visualiser le retour de chaque commande SQL.

Avec un fichier de configuration

On peut avoir besoin d’utiliser un fichier de configuration (selon ce que contient le script .bat).

Voila un exemple tout simple.

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion


:: Définition des variables fichier
set "sql_file_pattern=C:\chemin\vers\fichiers\sql\test_*.sql"
set "log_file_directory=C:\chemin\vers\fichiers\log"


:: Mot de passe en variable d'environnement
set "PGPASSWORD=mon_mdp"
set "pg_bin=C:\Program Files\PostgreSQL\15\bin"
set "PGCLIENTENCODING=UTF8"


:: Lecture du fichier de configuration
:: On utilise la valeur fourni en paramètre de notre script bat sinon on lit config.bat
if "%~1" neq "" (
  set "config_file=%~1"
) else (
  set "config_file=config.bat"
)
:: Lecture du fichier de configuration
:: S'il n'existe pas, on défini des valeurs par défaut
if exist %config_file% (
  call "%config_file%"
) else (
  set "db_host=localhost"
  set "db_port=5432"
  set "db_name=postgres"
  set "db_user=postgres"
  set "db_password=postgres"
)


:: Créer le répertoire de logs s'il n'existe pas
if not exist "%log_file_directory%" mkdir "%log_file_directory%"


:: Boucle sur tous les fichiers répondants au motif indiqué
for %%F in ("%sql_file_pattern%") do (
    set "sql_file=%%F"
    set "log_file=%log_file_directory%\%%~nF.log"

    echo Exécution du script : %%~nxF

    "%pg_bin%\psql.exe" ^
      --host "%db_host%" ^
      --port "%db_port%" ^
      --username "%db_user%" ^
      --dbname "%db_name%" ^
      --file "!sql_file!" ^
      --quiet ^
      > "!log_file!" 2>&1
)


:: Effacement du mot de passe
set "PGPASSWORD="

endlocal
set "db_host=127.0.0.1"
set "db_port=5432"
set "db_name=ma_badd"
set "db_user=postgres"
set "db_password=postgres"

Cet article vous a plu ?

N'hésitez pas à le partager, il interessera surement certains de vos contacts.

Les thèmes suivants contiennent des articles en lien avec celui-ci, allez faire un tour :

BashPostgreSQLSQL automatisation

50%