IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

Problème de requete SQL - PostgreSQL/Python/Psycopg2 [Python 3.X]


Sujet :

Réseau/Web Python

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 12
    Par défaut Problème de requete SQL - PostgreSQL/Python/Psycopg2
    Bonjour,

    Cela fait pas mal de temps que j'ai un petit soucis vraiment bête mais je n'arrive pas à le résoudre seul, c'est assez ragent.

    Le but de mon programme : se connecter à une BDD postgre et envoyer des requêtes sql. Le programme est écrit en python à l'aide de la librairie psycopg2. Le programme marche parfaitement, que ce soit pour la connexion ou l'envoie de requête sql

    Problème : il suffit que je fasse une faute dans une requête pour que toutes les autres requête soit fausses. A le dire comme cela, j'ai l'impression que l'initialisation de la variable qui stocke la requête ne se mets pas à zéro. Aucune erreur est retourné (Windows 10, Visual Studio Code).

    Voici le code dans une balise code et dans un fichier joint pour la personne qui aura vraiment le temps est l'envie. Le code dans le fichier joint est plus "agréable à regarder".

    Je vous remercie énormément d'avance !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    #---------------------------------------------------#
    import psycopg2
    import sys
    import os
    import socket
    from getpass import getpass
    #---------------------------------------------------#
    mot_de_passe = getpass()
    requete = None
    #---------------------------------------------------#
    os.system("cls")
     
    # Saisi des données de connexion
    print("\n\t***** Connexion BDD PostgreSQL *****")
    print("\nVeuillez saisir les informations de connexion : ")
    bdd = str(input("base de données : "))
    nom_user = str(input("nom d'utilisateur : "))
    mot_de_passe = str(getpass("mot de passe : "))
    port_user = input("Veuillez saisir le port (si vide, par défaut PostgreSQL) : ")
    if(port_user == ''):
        port_user = None
     
    # Test de connexion
    try:
        os.system("cls")
        print("\n... Connexion à la base de données en cours ...")
        conn = psycopg2.connect(dbname=bdd, user=nom_user, password=mot_de_passe,host='localhost', port=port_user)
        cursor = conn.cursor() # création du curseur
    except(psycopg2.Error):
        print("\n Erreur de connexion à la bdd, veuillez vérifier les info saisies !")
        input("\n Veuillez saisir ENTRER pour quitter le programme ...")
        sys.exit(0) # fermeture du programme
     
    # Affichage Image ASCII
    print("... Connecté avec succès !\n")
    with open('image_elephant.txt', 'r') as f:
    		for line in f:
    			print(line, end='')
     
    while(requete != 'q'):
     
        requete == '' #requete = None
     
        if(requete == ''): # permet de continuer meme si la requete est vide
            continue
        elif(requete == 'q'):
            input("\n\n... Fermeture du logiciel en cours ...\n\nVeuillez saisir ENTRER pour quitter")
            cursor.close() # fermeture du curseur
            conn.close() # fermeture de la connexion
            SystemExit
     
        try:
            requete = str(input("\n--> "))
            cursor.execute(requete)
            # Test de requete avec exception en cas d'erreur --> MARCHE PAS ! Une fois qu'on c'est trompé, toute les requetes suivante sont considérer comme fausses !
        except(psycopg2.ProgrammingError, psycopg2.InternalError): # permet d'eviter un crash si la requete SQL est mauvaise : psycopg2.Error
            print("Erreur, verifier votre requete !")
            continue
     
        results = cursor.fetchall()
        for r in results:
            print(r)
    #---------------------------------------------------#
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 304
    Par défaut
    Salut,

    1 Je ne comprend pas que ton script s'appelle psycopg2 et qu'on y trouve import psycopg2.

    2 Ta boucle while(requete != 'q'): n'a aucun sens, si tu entres (ligne 81) un 'q' pour quitter, c'est cursor.execute('q') qui va s'exécuter.

    3 Quelle est ton intention avec la ligne 70 requete == '' ?

    4 Pour l'histoire des requêtes fausses si la première contient une erreur, à mon avis le problème est ailleurs.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 12
    Par défaut
    1 : Le nom du fichier n'a aucune importance, je l'ai seulement renommer, il est vrai que ça porte à confusion

    2 : A bon ? J'ai toujours utilisé ce genre de boucle pour quitter un programme, tu as autre chose de plus propre ?

    3 : Mon intention est d’initialiser la variable requete à 0, enfin de la rendre clean.

    4 : je n'ai pas très bien compris :-/

    J'ai pas mal regardé dans la doc concernant les erreurs mais la, c'est seulement un soucis de variable mais que sais je ... :-/

    Je te remercie d'avoir pris du temps !

    Voici 2 screens pour voir vraiment se qu'il se passe :

    Nom : 1.png
Affichages : 855
Taille : 1,69 MoNom : 2.png
Affichages : 986
Taille : 229,1 Ko

    Comme on le voit dans ce 2 ème screens, si je fais une faute de frappe puis qu'ensuite je me reprend, le prog dit que la requete est fausse. C'est seulement à ce niveau la que je bloque, en espèrent avoir été assez concret et clair :-/

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 304
    Par défaut
    Ce que je veux dire c'est que tu dois faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        requete = str(input("\n--> "))
        if requete == 'q':
            fermeture et exit 
     
        try: 
            cursor.execute(requete)
        except( etc...)

  5. #5
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 304
    Par défaut
    3 : Mon intention est d’initialiser la variable requete à 0, enfin de la rendre clean.
    J'ai pas réagit tout de suite, mais ça ne marche pas.
    Tout d'abord tu aurais dût faire requete = '' pour cela, mais ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while(requete != 'q'):
     
        requete = '' # j'ai corrigé
     
        if(requete == ''): # permet de continuer meme si la requete est vide
            continue
    tu entres dans une boucle infinie, regarde bien.

    Pour ton erreur, vraiment je ne vois pas et j'ai été voir la-bas.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 12
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Ce que je veux dire c'est que tu dois faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        requete = str(input("\n--> "))
        if requete == 'q':
            fermeture et exit 
     
        try: 
            cursor.execute(requete)
        except( etc...)
    Je te remercie pour ce petit bout de code, je l'intégrerai des que j'aurai trouvé l'erreur, encore merci !

    Concernant les screens que j'ai mis ci dessus, tu pencherai vers quel erreur ? Est-ce moi qui initialise mal ma variable requete (à l'aide de requete == '' ou requete = None) ou un autre problème ?

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 12
    Par défaut
    Citation Envoyé par VinsS Voir le message
    J'ai pas réagit tout de suite, mais ça ne marche pas.
    Tout d'abord tu aurais dût faire requete = '' pour cela, mais ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while(requete != 'q'):
     
        requete = '' # j'ai corrigé
     
        if(requete == ''): # permet de continuer meme si la requete est vide
            continue
    tu entres dans une boucle infinie, regarde bien.

    Pour ton erreur, vraiment je ne vois pas et j'ai été voir la-bas.
    Concernant le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete = '' # j'ai corrigé
    , ça ne marche pas, je l'avais déjà essayé avant. La ligne de commande ne s'affiche pas.

    Pour la boucle infini, dit comme cela il y a peut etre une erreur de logique de mon coté. Je voulais saisir des commandes sql tant que Q n'est pas saisi, je pense que je devrais revoir mes boucles

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 681
    Par défaut
    Salut,

    Dans mes souvenirs(*), en cas d'erreur le "cursor" est inutilisable sauf à le fermer et en créer un autre ou de faire un .rollback().
    (*) pas le temps de tester.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 12
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Dans mes souvenirs(*), en cas d'erreur le "cursor" est inutilisable sauf à le fermer et en créer un autre ou de faire un .rollback().
    (*) pas le temps de tester.

    - W
    Aaaaa mais oui je pense que tu as raison, j'ai entendu parler de ça dans un forum anglais !!! Merci beaucoup, je corrige cela et je reviens directement vous tenir au courant de ça, merci encore wiztricks !

  10. #10
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 12
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Dans mes souvenirs(*), en cas d'erreur le "cursor" est inutilisable sauf à le fermer et en créer un autre ou de faire un .rollback().
    (*) pas le temps de tester.

    - W
    Que du bon, un simple "conn.rollback" à suffit, je te remercie encore !!

    Voici le code au cas ou ça intéresserai quelqu'un ou ne serait-ce que pour les curieux ^^

    On m'a reproché d'avoir fait une boucle infini avec mon While, l'erreur est corrigé ou je patauge encore ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    while(requete != 'q'):
        requete = None
        requete = str(input("\n--> "))
     
        if(requete == ''): # permet de continuer meme si la requete est vide
            continue
        try:
            cursor.execute(requete)
        except(psycopg2.ProgrammingError, psycopg2.InternalError):
            print("Erreur, verifier votre requete !")
            conn.rollback()
            continue
     
        results = cursor.fetchall()
        for r in results:
            print(r)
     
    input("\n\n... Fermeture du logiciel en cours ...\n\nVeuillez saisir ENTRER pour quitter")
    cursor.close() # fermeture du curseur
    conn.close() # fermeture de la connexion
    SystemExit

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 681
    Par défaut
    Citation Envoyé par virtualy034 Voir le message
    Voici le code au cas ou ça intéresserai quelqu'un ou ne serait-ce que pour les curieux ^^
    Bah, tous les sgdb viennent déjà avec des outils qui permettent de soumettre des requêtes en ligne de commande et des outils plus conviviaux....

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 12
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Bah, tous les sgdb viennent déjà avec des outils qui permettent de soumettre des requêtes en ligne de commande et des outils plus conviviaux....

    - W
    Ce n'est aucunement pour l'utiliser tous les jours mais savoir codé un petit programme comme ça aide pour les débutants, c'est pas pure curiosité

  13. #13
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 304
    Par défaut
    Citation Envoyé par virtualy034 Voir le message
    On m'a reproché d'avoir fait une boucle infini avec mon While, l'erreur est corrigé ou je patauge encore ?
    Il n'y a plus de boucle infinie mais si tu entres 'q' la requête sera exécutée avec 'q' au lieu de quitter.

  14. #14
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 12
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Il n'y a plus de boucle infinie mais si tu entres 'q' la requête sera exécutée avec 'q' au lieu de quitter.
    J'ai préféré sortir de la boucle à l'aide d'un petit break :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    while(requete != 'q'):
     
        ...
        elif(requete == 'q'):
            break
        ...
     
    input("\n\n... Fermeture du logiciel en cours ...\n\nVeuillez saisir ENTRER pour quitter")
    cursor.close() # fermeture du curseur
    conn.close() # fermeture de la connexion
    SystemExit

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec requete SQL/type NumAuto
    Par Mimisio dans le forum VBA Access
    Réponses: 5
    Dernier message: 27/07/2007, 11h56
  2. problème lancement requete sql
    Par skanderb dans le forum JSF
    Réponses: 4
    Dernier message: 02/05/2007, 16h46
  3. [WD 11] problème de requete SQL-LIKE
    Par fabpeden dans le forum WinDev
    Réponses: 5
    Dernier message: 24/04/2007, 17h07
  4. problème de requete SQL et recherche
    Par franfr57 dans le forum ASP
    Réponses: 1
    Dernier message: 16/03/2006, 13h33
  5. [ACCESS][SQL] Problème avec requete SQL ...
    Par mpascolo dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 09/11/2005, 10h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo