Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Fri 09 December 2016 10:49

Lucie D.
Participant actif
Date d'inscription: 21 Oct 2013
Messages: 137

PostGis:affichage des résultats intermédiaires d'une liste de requêtes

Bonjour,

J'ai dû sortir une liste de requêtes assez longues pour une étude (plusieurs pages).
Après un premier test validé sur un département, je cherche à pouvoir lancer l'intégralité de cette liste de requêtes sur chaque département sans plus avoir à cliquer sur le bouton "lancer la requête" entre chacune d'entre elles. Ceci est faisable bien-sûr. Mais je cherche malgré tout à obtenir les sorties de données de chacune des requêtes.

Savez-vous s'il y a moyen d'obtenir la liste des résultats de chaque requête de ma liste dans l'ordre où elles ont été effectuées?

Par exemple pour une liste de requêtes de ce genre (je simplifie franchement!) :

Code:

1°/
CREATE TABLE xxx
AS
SELECTxxx
FROM xxx
JOIN xxx
ON xxx;

2°/
ALTER TABLE xxx
ADD COLUMN xxx xxx;

3°/
WITH xxx AS
(SELECT xxx
FROM xxx
WHERE xxx = xxx)
UPDATE xxx
SET xxx=xxx;

j'aimerais obtenir qqch de ce type dans la fenêtre "sorties de données":

Code:

La requête a été exécutée en tant de temps, tant de lignes modifiées.
La requête a été exécutée en tant de temps.
La requête a été exécutée en tant de temps, tant de lignes modifiées.

Actuellement, si je lance ma liste de requêtes, je n'obtiens que le résultat de la dernière requête effectuée, ce qui est logique...
L'objectif de ma demande est de ne plus perdre de temps à savoir si chaque requête a terminé de s'effectuer avant de lancer la suivante, mais bien de tout lancer d'un seul coup tout en gardant les résultats de chaque requête (ceux-ci me servent à faire des vérifications).

Je vous remercie par avance pour votre aide toujours aussi précieuse!

Bonne journée.

Bien cordialement,

Lucie

Hors ligne

 

#2 Fri 09 December 2016 12:03

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: PostGis:affichage des résultats intermédiaires d'une liste de requêtes

Bonjour,

Pour faire cela, lancez le script SQL contenant les requetes en ligne de commande avec psql.
Ajoutez \timing au debut de votre script sql, pour activer le mode timing.

L'execution du script SQL indiquera dans la fenetre dos le temps et le resultat de chaque commande.
Pour garder le tout dans un fichier: redirigez la sortie de la commande:

Code:

psql -f monscript.sql -p monport -h monhost -d database > monscript.log 2>&1

Vous pouvez aussi utilisez des logiciels SQL qui lancent des scripts et vous montrent leur execution en temp réel (style Datagrip).

Nicolas

Hors ligne

 

#3 Fri 09 December 2016 14:43

Lucie D.
Participant actif
Date d'inscription: 21 Oct 2013
Messages: 137

Re: PostGis:affichage des résultats intermédiaires d'une liste de requêtes

Bonjour Nicolas,

Merci beaucoup c'est effectivement exactement ce que je voulais.
Par contre, je ne comprends pas, quel est l'intérêt du 2>&1 à la fin de la ligne de commande? Qu'est-ce que ça fait si je ne le mets pas?
De même pourquoi choisissez-vous un .log pour le fichier résultat? De mon côté j'ai choisi un .txt. Ça fonctionne également avec le .log mais quelle est la plus-value de cette extension?

Merci beaucoup!

Lucie

Hors ligne

 

#4 Fri 09 December 2016 15:09

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1160

Re: PostGis:affichage des résultats intermédiaires d'une liste de requêtes

Salut

Par contre, je ne comprends pas, quel est l'intérêt du 2>&1 à la fin de la ligne de commande? Qu'est-ce que ça fait si je ne le mets pas?


Traditionnellement, un programme en ligne de commande possède trois flux qui lui permettent de communiquer : le flux d'entrée, le flux de sortie et le flux d'erreur.

On appelle redirection l'action de diriger un flux vers une entrée quelconque, typiquement un fichier ou le flux d'entrée d'un autre programme. La redirection du flux de sortie est effectuée grâce à l'opérateur >.

Ce que l'on souhaite rediriger le plus souvent, c'est le flux de sortie d'un programme.
Mais parfois, il peut être utile d'avoir des informations sur les éventuelles erreurs, et ce via le flux d'erreur.
Ce qui signifie 2>&1, c'est rediriger le flux 2 (le flux d'erreur) vers (>) le flux 1 (le flux de sortie).
Le & permet juste à votre interpréteur de commande de faire la différence entre 1 ( un fichier qui s'appelle 1)
et le flux 1 à proprement parler.
Vous obtenez donc un fichier contenant les flux de sortie et d'erreur de votre programme.

Vous auriez pu vouloir avoir les erreurs et les sorties séparées dans deux fichiers distincts,
pour cela vous auriez taper quelquechose comme ceci :

Code:

psql -f monscript.sql -p monport -h monhost -d database > monscript.log 2>error.log

De même pourquoi choisissez-vous un .log pour le fichier résultat? De mon côté j'ai choisi un .txt. Ça fonctionne également avec le .log mais quelle est la plus-value de cette extension?


Aucune plus-value, si ce n'est sémantique. Cela peut vous permettre de distinguer des fichiers textes classiques (votre dernier poème...)
des fichiers journaux d'une application. Utile par exemple quand vous voulez recherchez tout les fichiers journaux d'un répertoire.

Dernière modification par tumasgiu (Fri 09 December 2016 16:44)

Hors ligne

 

#5 Fri 09 December 2016 15:24

Lucie D.
Participant actif
Date d'inscription: 21 Oct 2013
Messages: 137

Re: PostGis:affichage des résultats intermédiaires d'une liste de requêtes

Bonjour,

Merci beaucoup pour toutes ces précisions!
Effectivement, après avoir testé avec et sans le 2>&1, je vois que les erreurs apparaissent ou n'apparaissent pas! Or je veux qu'elles apparaissent donc parfait je le laisse! ;-)

Et pour le .log c'est noté je privilégierai le .log, non pas que je sauvegarde des poèmes sur mon ordinateur du boulot ;-) , mais tant d'autres .txt en lien avec mon travail!!! XD

Bonne fin de journée!

Bien cordialement,

Lucie D.

Hors ligne

 

#6 Sat 10 December 2016 10:11

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: PostGis:affichage des résultats intermédiaires d'une liste de requêtes

Merci tumasgiu pour ces précisions !
J'ai été un peu succinct dans mes explications.

Nico

Hors ligne

 

#7 Mon 12 December 2016 14:30

Lucie D.
Participant actif
Date d'inscription: 21 Oct 2013
Messages: 137

Re: PostGis:affichage des résultats intermédiaires d'une liste de requêtes

Bonjour,

Je reviens sur le forum car la méthode décrite ci-dessus fonctionne très bien, mais au final, je me rends compte qu'elle ne me suffit pas.
Savez-vous si, dans mon fichier de sortie (.log) je peux forcer la réécriture de chaque requête avant d'avoir le résultat (temps d'exécution, nombre de lignes modifiées)?

Du coup si je reprends mon exemple ci-dessus ça me donnerait :

Code:

1°/
CREATE TABLE xxx
AS
SELECTxxx
FROM xxx
JOIN xxx
ON xxx;

[i]La requête a été exécutée en tant de temps, tant de lignes modifiées.[/i]

2°/
ALTER TABLE xxx
ADD COLUMN xxx xxx;

[i]La requête a été exécutée en tant de temps.[/i]

3°/
WITH xxx AS
(SELECT xxx
FROM xxx
WHERE xxx = xxx)
UPDATE xxx
SET xxx=xxx;

[i]La requête a été exécutée en tant de temps, tant de lignes modifiées.[/i]

Je me demande aussi s'il existe des lignes de commande conditionnelles avec psql ou même à écrire directement dans ma requête...
Par exemple en cas de doublon parfait sur un objet, dans ma requête j'écris :

Code:

SELECT champ1, count(*)
FROM matable
GROUP BY champ1
HAVING count(*) >1;

Si par exemple la requête me retourne une ligne de doublons parfaits (tous les champs sont égaux entre eux), je voudrais pouvoir lancer une requête de suppression des doublons.
Mais si je n'ai pas de doublons, je passe...

En fait je me rends compte que c'est presque de la programmation que je veux faire...non? Je me demande si je passe par les bons outils...

En gros je cherche un moyen d'automatiser une liste de requêtes SQL tout en gardant un contrôle sur les résultats intermédiaires (et en les enregistrant!) et en gérant les erreurs du style : en cas d'erreur, psql s'arrête et me le signale dans mon fichier de sortie des résultats/erreurs. Mais je voudrais justement pouvoir contrôler aussi si une erreur mérite que psql s'arrête ou s'il peut continuer les requêtes suivantes malgré tout.

Je ne sais pas comment fonctionne Datagrip...Je n'ai rien trouvé de très clair sur le net à ce sujet? Comment ça fonctionne?

Désolée pour toutes ces questions, j'espère avoir été claire...Quand il s'agit d'automatisation, je pense tout de suite à Python, mais je ne maitrise quasiment pas...Qu'en pensez-vous?

Merci beaucoup pour votre aide!

Bien cordialement,

Lucie D.

Hors ligne

 

#8 Mon 12 December 2016 15:27

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: PostGis:affichage des résultats intermédiaires d'une liste de requêtes

Bonjour,

Oui, il est possible d'afficher chaque requete exécutée dans le script comme sortie de psql, c'est l'option -e (echo):
https://www.postgresql.org/docs/9.5/sta … -psql.html

Oui ce que vous voulez faire est de la programmation.
Vous pouvez la faire dans tous les langages que vous voulez, mais le plus proche du SQL pour le faire est le PL/PGSQL:
https://www.postgresql.org/docs/9.5/static/plpgsql.html

Vous pouvez alors écrire une fonction, qui peut prendre des parametres pour faire des choses différentes suivant le contexte, ou écrire un block anonyme si le travail n'est a faire qu'une fois, ou tjs exactement le meme:
https://www.postgresql.org/docs/9.5/static/sql-do.html

Dans cette fonction, vous pourrez faire ce que vous voulez: stocker et tester des résultats de requêtes, ne faire des requetes que de façon conditionnelle, chronométrer les requetes, afficher ce que vous voulez, etc.

Datagrip est un peu comme PgAdmin, mais plus orienté écriture de SQL qu'admin de la base.
Vous gérer des fichiers SQL ou des connexions sur une ou plusieurs bases.
Il est très très fort pour autocompléter le SQL: avec lui, vous ne tapez presque plus de SQL smile

le plus simple est encore de le tester: https://www.jetbrains.com/datagrip/download/

Nicolas

Dernière modification par Nicolas Ribot (Mon 12 December 2016 15:28)

Hors ligne

 

#9 Mon 12 December 2016 15:55

Lucie D.
Participant actif
Date d'inscription: 21 Oct 2013
Messages: 137

Re: PostGis:affichage des résultats intermédiaires d'une liste de requêtes

Super! Merci infiniment pour toutes ces précisions, je vais faire des tests et reviens sur le forum dès que mes tests sont concluants! ;-)

Bonne fin de journée!

Lucie D.

Hors ligne

 

#10 Mon 12 December 2016 19:05

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: PostGis:affichage des résultats intermédiaires d'une liste de requêtes

Un exemple de bloc anonymes avec quelques lignes de code:
(la doc PG est plutot claire sur le langage plpgsql)

Code:

-- Test d'un bloc anonyme permettant d'executer du code pl/pgsql:

-- $$ permet en SQL de faire une chaine de caractère, comme '', mais sur plusieurs lignes:
-- apres le DO, ce qui suit est un gros texte contenant le code pl/pgsql.
DO $$

-- dans la directive declare, on déclare les variables dont on veut se servir (memes types que le SQL)
DECLARE
  num_rec int := 1;

  max_serie int :=20;

-- Le corps du code commence par begin et finit par end;
BEGIN
  -- SELECT... qd on veut stocker le resultat du select, PERFORM qd on veut juste exécuter la requete sans jouer
  -- avec les lignes renvoyées
  perform * from generate_series(1, max_serie);
  
  -- récupérer des infos mises a jour par PG (https://www.postgresql.org/docs/9.5/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-DIAGNOSTICS):
  GET DIAGNOSTICS num_rec = ROW_COUNT;

  -- raise permet de lancer des messages, error, warning, notice...
  raise notice 'Nbre de ligne du select: %', num_rec;

  -- test IF
  if num_rec > 10 THEN
    raise notice '10 ou moins';
  ELSE
    raise notice 'plus de 10';
  end IF;

END;
$$;

Nicolas

Hors ligne

 

Pied de page des forums

Powered by FluxBB