Je fais régulièrement des tests sous PostgreSQL. A chaque fois il me faut exécuter une série de fichiers SQL mais surtout avoir un retour sur ce qui se passe et ce de façon clair et lisible.
Pour exécuter une série de fichier SQL, n’hésitez pas à consulter cet article :
Pour les retours, nous allons donc générer des logs personnalisés car les retours faits par PostgreSQL sont intéressant… mais pas toujours…
En effet, il peut être intéressant de choisir ce qui est retourné et donc renseigné dans les logs. Voici quelques astuces.
Paramétrage de PSQL
Pour limiter les retours, utilisez l’option --quiet de psql qui le force à limiter les retours.
Afficher un message personnalisé
Pour afficher un message personnalisé, utilisez la méta-commande \echo suivie de votre message. Utilisez \n pour ajouter un saut de ligne.
\echo 'Tests SQL\n======================\n'
Retournera alors :
Tests SQL ======================
Pour insérer une simple ligne vide, utilisez \echo ''.
Restreindre les données affichées
Lorsqu’une requête SELECT est exécutée, il est possible de restreindre les éléments affichés.
\pset tuples_only on (par défaut à off) permet de n’afficher que les données retournées et non toutes les décorations qui vont avec (le tableau de données)
Voici un exemple :
\echo 'Avec les décorations'
SELECT
1 as "colonne a",
'abc' as "colonne b"
;
\echo 'Sans les décorations'
\pset tuples_only on
SELECT
1 as "colonne a",
'abc' as "colonne b"
;
Retournera alors :
Avec les décorations
colonne a | colonne b
-----------+-----------
1 | abc
(1 ligne)
Sans les décorations
1 | abc
Il est parfois utile d’exécuter une requête mais sans vouloir afficher le résultat, par exemple pour exécuter une fonction. Il faut alors utiliser un bloc de code anonyme avec le mot clé PERFORM tel que suivant :
DO $$ BEGIN PERFORM 'aa' as "colonne 1"; END $$; DO $$ BEGIN PERFORM gen_random_uuid(); END $$;
Vous aurez alors ce retour :
Exécuter une requête sans retour
Gérer les messages des codes PL/pgSQL
Le code PL/pgSQL exécuté par les fonctions ou les procédures peut renvoyer des messages de différents niveaux. Il est possible de contrôler leur affichage.
Voici les différents niveaux disponibles :
DEBUG,LOG,INFO,NOTICE,WARNING,EXCEPTION
Pour spécifier le niveau pouvant être afficher il suffit d’utiliser la requête suivante :
SET client_min_messages TO NOTICE;
Voici un exemple au sein d’un bloc de code anonyme :
\echo '❗Spécifier le niveau des messages à afficher' \echo '❓Tous les message supérieur ou égal à NOTICE s''affichent' SET client_min_messages TO NOTICE; DO $$ BEGIN RAISE NOTICE 'Voici un message de notification'; RAISE WARNING 'Voici un message d''avertissement'; END $$; \echo '❓Tous les message supérieur ou égal à WARNING s''affichent' SET client_min_messages TO WARNING; DO $$ BEGIN RAISE NOTICE 'Voici un message de notification'; RAISE WARNING 'Voici un message d''avertissement'; END $$;
Qui retourne :
❗Spécifier le niveau des messages à afficher ❓Tous les message supérieur ou égal à NOTICE s'affichent NOTICE: Voici un message de notification WARNING: Voici un message d'avertissement ❓Tous les message supérieur ou égal à WARNING s'affichent WARNING: Voici un message d'avertissement
Un exemple complet
Voici un exemple complet :
\echo 'Tests SQL\n======================\n'
\echo 'Les retours attendus sont indiqué par "❓" en début de ligne'
\echo 'Les commentaires commencent par "❗" en début de ligne'
\echo '\n'
\echo '❗Avec les décorations'
\echo '❓Le tableau complet doit apparaitre'
SELECT
1 as "colonne a",
'abc' as "colonne b"
;
\echo ''
\echo '❗Sans les décorations'
\echo '❓Seule les données doivent apparaitre'
\pset tuples_only on
SELECT
1 as "colonne a",
'abc' as "colonne b"
;
\echo '\n'
\echo '❗Exécuter une requête sans retour'
\echo '❓Rien ne doit apparaitre sous cette ligne'
DO $$ BEGIN
PERFORM 'aa' as "colonne 1";
END $$;
DO $$ BEGIN
PERFORM gen_random_uuid();
END $$;
\echo '\n'
\echo '❗Spécifier le niveau des messages à afficher'
\echo '❓Tous les message supérieur ou égal à NOTICE s''affichent'
SET client_min_messages TO NOTICE;
DO $$ BEGIN
RAISE NOTICE 'Voici un message de notification';
RAISE WARNING 'Voici un message d''avertissement';
END $$;
\echo ''
\echo '❓Tous les message supérieur ou égal à WARNING s''affichent'
SET client_min_messages TO WARNING;
DO $$ BEGIN
RAISE NOTICE 'Voici un message de notification';
RAISE WARNING 'Voici un message d''avertissement';
END $$;
Tests SQL
======================
Les retours attendus sont indiqué par "❓" en début de ligne
Les commentaires commencent par "❗" en début de ligne
❗Avec les décorations
❓Le tableau complet doit apparaitre
colonne a | colonne b
-----------+-----------
1 | abc
(1 ligne)
❗Sans les décorations
❓Seule les données doivent apparaitre
1 | abc
❗Exécuter une requête sans retour
❓Rien ne doit apparaitre sous cette ligne
❗Spécifier le niveau des messages à afficher
❓Tous les message supérieur ou égal à NOTICE s'affichent
psql:test.sql:50: NOTICE: Voici un message de notification
psql:test.sql:50: WARNING: Voici un message d'avertissement
❓Tous les message supérieur ou égal à WARNING s'affichent
psql:test.sql:58: WARNING: Voici un message d'avertissement
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 :
PostgreSQLSQL log