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