Pages: 1
- Sujet précédent - PostGis:affichage des résultats intermédiaires d'une liste de requêtes - Sujet suivant
#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
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
Pages: 1
- Sujet précédent - PostGis:affichage des résultats intermédiaires d'une liste de requêtes - Sujet suivant