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

Python Discussion :

Formulation en Python d'une requète SQLite : problème mystérieux.


Sujet :

Python

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut Formulation en Python d'une requète SQLite : problème mystérieux.
    Bonjour à tous.

    Je suis complètement novice en Python, mais je fais faire le plus gros du travail par ChatGPT, et, jusqu'à maintenant, ça a plutôt bien marché, mais là nous butons tous les deux sur un point de blocage.

    J'ai extrait de mon code complet ces quelques dizaines de lignes pour faire un programme de test :
    Code Python : 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
    65
    66
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    import sqlite3
    import os
    import time
    from os import system
    from time import sleep
    import datetime
    try:
        conn = sqlite3.connect('SQLite3/Esperance.db')
    # Creation d'un objet curseur
        cursor = conn.cursor()
        T_Ext = 0
        while T_Ext < 2:
            T_Amb = 0
            while T_Amb < 3:
                Prog = 0
                while Prog < 3:
                    Heure = 0
                    while Heure < 2:
                        Etat = 0
                        while Etat < 2:
                            valeurs=('T_Ext','T_Amb','Prog','Heure','Etat')
                        # Recherche de l'ordre à donner dans la table Ordres
                            requete=(
                                "SELECT Ordre FROM Ordres "
                                "WHERE T_Ext = ? "
                                "AND T_Amb =? "    
                                "AND Prog =? "    
                                "AND Heure =? "   
                                "AND Etat =?"
                             )
                            sql_query = (requete % valeurs)
                            with open("espion1.txt", 'a') as espion:
                                espion.write("Requête SQL : ",sql_query)
                            cursor.execute(requete, valeurs)
                            Ordre=cursor.fetchone()
                            ordre1 = str(Ordre[0]) if Ordre else "x"
                            # Formatage de la chaîne de sortie
                            output_string = (
                                f"T_Ext = {T_Ext:d}, "
                                f"T_Amb = {T_Amb:d}, "
                                f"Prog = {Prog:d}, "
                                f"Heure = {Heure:d}, "
                                f"Etat = {Etat:d}, "
                                f"Requête SQL = {sql_query} : "
                                f"Ordre = {ordre1:s}\n"
                            )
     
     
                            with open("espion1.txt", 'a') as espion:
                                espion.write(output_string)
                            Etat = Etat+1
                        Heure=Heure+1
                    Prog=Prog+1
                T_Amb=T_Amb+1
            T_Ext=T_Ext+1
    # Terminer et fermer la connexion
        conn.commit()
    except sqlite3.Error as e:
        print(e)
    #    with open("temperature.txt", 'a') as fichier:
    #        fichier.write ("Erreur SQLite3 : " + e + "\n")
    finally: 
        if conn:
            conn.close()
    Et voici le message d'erreur :
    Traceback (most recent call last):
    File "/home/yves/Testordres1.py", line 33, in <module>
    sql_query = (requete % valeurs)
    TypeError: not all arguments converted during string formatting
    Voir ligne 33 dans le code.
    J'ai tenté de commenter une par une les lignes du select, mais ça n'y change rien.
    J'ai vérifié dix fois que les variables étaient bien des entiers, tel que déclaré dans la base (vérifié dix fois aussi). ChatGPT n'a repéré aucune erreur dans mon code (ou plutôt, il me les a toutes fait corriger) mais il n'y a rien à faire.

    Merci a qui voudra bien se plonger là dedans ( c'est un peu long, mais Python est un peu verbeux...)

    AMIcalement.

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Bonjour,

    Je vais essayer d'ignorer la partie chatGPT, car une condition pour l'utiliser en programmation, est de connaître un minimum les bases du langage sur lequel vous allez travailler...

    EDIT : C'est un SELECT, mal observé !

    À quoi ressemble votre table Ordres ?

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    Par défaut
    Salut,

    Si on écrit requete % valeurs, c'est dans l'intention de remplacer un placeholder (ici "?") dans requête avec un item du tuple valeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> 'a ? b ?' % ('c', 'd')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: not all arguments converted during string formatting
    L'intention est matérialisée par le % qui est bien connu par les programmeurs C (et Python) mais dans ce cas le "placeholder" est "%s" et npn "?":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> 'a %s b %s' % ('c', 'd')
    'a c b d'
    Mais le '?' est aussi placeholder pour sqlite avec python, mais c'est pas % qui fait le job mais execute i.e. cursor.execute(requete, valeurs) devrait fonctionner.
    Pour faire fonctionner votre code, un habile replace de ? par %s devrait le faire.

    Je suis complètement novice en Python, mais je fais faire le plus gros du travail par ChatGPT,
    Cool... Sur une bagnole conduite par une IA, le conducteur reste responsable... et donc doit avoir son permis de conduire. Après vous faites un peu ce que vous voulez: ça ne tuera personne... mais il faut pas venir pleurer ensuite parce que vous ne comprenez pas ce que vous n'avez jamais cherché à comprendre. (D'autant qu'en poussant la porte pour entrer ici, vous êtes supposé savoir qu'il faut s'être un peu formé avant de demander de l'aide).

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

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Merci de vos aides. J'entends bien vos critiques, et je ne suis pas prêt de me mettre au volant d'une voiture pilotée par "IA".

    Je suis novice ne Python, mais je ne crois pas être ne mesure de lister tous les langages que j'ai utilisé pour programmé dans ma vie sans en oublier, mais laissons cela de côté.

    J'ai modifié mon programme d'après ce que j'ai compris de vos réponses, et voici le résultat :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                            valeurs=('T_Ext','T_Amb','Prog','Heure','Etat')
                        # Recherche de l'ordre à donner dans la table Ordres
                            requete=(
                                "SELECT Ordre FROM Ordres "
                                "WHERE T_Ext = %s "
                                "AND T_Amb = %s "
                                "AND Prog = %s "
                                "AND Heure = %s? "
                                "AND Etat = %s?"
                             )
                            sql_query = requete % (valeurs)
    Malheureusement, Python n'est pas toujours très bavard... A vot' bon cœur...

    AMIcalement.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    Par défaut
    Citation Envoyé par L'AMI Yves Voir le message
    Malheureusement, Python n'est pas toujours très bavard...
    Le code que vous montrez fonctionne sans erreur chez moi.

    Citation Envoyé par L'AMI Yves Voir le message
    mais je ne crois pas être ne mesure de lister tous les langages que j'ai utilisé pour programmé dans ma vie sans en oublier, mais laissons cela de côté.
    Aujourd'hui, c'est python qu'il vous faut maîtriser... et les langages que je pratiquais dans les années 70s ne me sont d'aucune aide.

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

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Vous avez vu la onzième ligne de mon post ? Je suppose que c'est celle-là qui est la cause de l'erreur.

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Vous avez vu la onzième ligne de mon post ?
    Avez-vous lu la 8ème et 9ème ligne de votre post ?

  8. #8
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Est-cela que vous attendez ?
    Code sql : 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
    CREATE TABLE Ordres (
            T_Ext INTEGER,
            T_Amb INTEGER,
            Prog INTEGER,
            Heure INTEGER,
            Etat INTEGER,
            Ordre INTEGER
        );
    INSERT INTO Ordres VALUES(0,0,0,0,0,1);
    INSERT INTO Ordres VALUES(0,0,0,1,0,1);
    INSERT INTO Ordres VALUES(0,0,1,0,0,1);
    INSERT INTO Ordres VALUES(0,0,1,1,0,1);
    INSERT INTO Ordres VALUES(0,0,2,0,0,1);
    INSERT INTO Ordres VALUES(0,0,2,1,0,1);
    INSERT INTO Ordres VALUES(0,1,1,0,0,1);
    ....
    Est-ce que cela peut faire avancer le schimlblick ?

  9. #9
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Est-cela que vous attendez ?
    Vous répondez aux questions par décalage, outre cela 8 et 9ème ligne de votre post précédent dans votre code, il y a des points d'interrogation qui n'ont rien à faire dans votre ligne de requête.

    La création de votre table indique les types attendus pour déterminer une recherche par comparaison. Il est étonnant que vous recherchiez toutes les lignes de votre base de données où leurs colonnes sont les valeurs des éléments de valeurs.

    Peut-être que la proposition de wiztricks ne provoquera plus d'erreur, mais ça ne doit pas retourner grand chose comme résultat.

  10. #10
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Il y a beaucoup d'esprits forts par ici. Je ne me sens pas du tout comme ça.

    Oui il y avait des points d'interrogation qui n'avaient rien à faire là. Il n'y étaient pas avant : c'est sans doute des erreurs de correction. Mais cette correction n'a pas résolu le problème du "%".

    Pour expliquer la raison d'être de cette table : c'est la table de vérité d'un automate à états : il y a 5 variables d'entrées, dont certaines peuvent valoir 0 ou 1, d'autres 0,1 ou 2 etc. Du jeu de variable d'entrée se déduit un ordre. J'ai raisonné sur le problème : toute une bardée de "if" "else" dans un code inmaintenable, ou une table de base de données ? Ai-je raisonné comme une peau de tambour ? La table de vérité est créée sous forme d'une feuille Excel, et le code de création de la table SQLite est généré par une macro VBA. Il est vrai que je suis revenu plusieurs fois sur la table de vérité : sur la feuille Excel, j'arrive à raisonner. Dans l'imbroglio des if/else, je n'y crois pas.

    Qu'entendez-vous par "vous répondez par décalage" ? C'est une question de comptage des lignes ? J'ai présenté la chose comme ça, car, sur mon écran, cette ligne 11 ne se révélait qu'en actionnant l'ascenseur du message.

    AMIcalement.

  11. #11
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Oui il y avait des points d'interrogation qui n'avaient rien à faire là. Il n'y étaient pas avant : c'est sans doute des erreurs de correction. Mais cette correction n'a pas résolu le problème du "%".
    certes, mais ça aurait pu, maintenant on sait qu'il n'y a pas que cette erreur d'écriture qui posait problème.

    Pour expliquer la raison d'être de cette table : c'est la table de vérité d'un automate à états : il y a 5 variables d'entrées, dont certaines peuvent valoir 0 ou 1, d'autres 0,1 ou 2 etc. Du jeu de variable d'entrée se déduit un ordre. J'ai raisonné sur le problème : toute une bardée de "if" "else" dans un code inmaintenable, ou une table de base de données ? Ai-je raisonné comme une peau de tambour ? La table de vérité est créée sous forme d'une feuille Excel, et le code de création de la table SQLite est généré par une macro VBA. Il est vrai que je suis revenu plusieurs fois sur la table de vérité : sur la feuille Excel, j'arrive à raisonner. Dans l'imbroglio des if/else, je n'y crois pas.
    Mettez tout cela de côté, y compris votre code, ce ne sont que des détails, vous avez votre base de données, vos lignes et vos colonnes, essayez de créer une requête qui par exemple recherche la ligne 0,0,1,1,0,1, comment feriez vous ?

    EDIT :

    Par ex. ce petit code chez vous devrait fonctionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import sqlite3
     
    connection = sqlite3.connect('SQLite3/Esperance.db')
    cursor = connection.cursor()
     
    values = (0, 1, 1)
    result = cursor.execute("SELECT Ordre FROM Ordres WHERE T_ext = ? AND Prog = ? AND Heure = ?", values)
    print(result.fetchone()[0])
    Observer le format de values et celui que vous présenté dans valeurs.

    Qu'entendez-vous par "vous répondez par décalage" ?
    Votre réponse correspond à mon premier post, alors que dans le second post, je posais une autre question, il y avait donc un décalage dans vos réponses (peut-être aurait-on pu lier vos réponses à l'ensemble de mes questions, mais c'est un détail).

    Il y a beaucoup d'esprits forts par ici. Je ne me sens pas du tout comme ça.
    Je ne vois pas où vous voulez en venir, ce que je ressens c'est que vous semblez un peu perdu, et à mon sens c'est directement lié au fait que vous ayez un peu trop facilement laissé la conduite de votre projet à chatGPT.
    Pas de soucis, on peut reprendre tout ça depuis le début, car oui, reprendre le sujet à bras le corps est un minimum pour que vous puissiez comprendre ce que raconte chatGPT et le corriger éventuellement.

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    Par défaut
    Dans ma première réponse, j'indiquais:

    Citation Envoyé par wiztricks Voir le message
    Pour faire fonctionner votre code, un habile replace de ? par %s devrait le faire.
    Cela permet de passer de l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> 'a ? b ?' % ('c', 'd')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: not all arguments converted during string formatting
    à la construction de la chaine de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> 'a ? b ?'.replace('?', '%s') % ('c', 'd')
    'a c b d'
    en gardant les '?' comme placeholder de la requête sqlite qui vient après.

    - W

    PS: Et si, in fine, python est content mais que ça ne fait pas ce que vous voulez, c'est que vous avez un soucis de conception: comment reformuler ce que vous cherchez à faire pour que ce soit programmable avec python? C'est un autre sujet et d'autres forums.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    @fred1599 Pour ce que j'ai compris de Python (par l'intermédiaire de ChatGPT, mais je ne le tiens pas pour infaillible, je m'en suis aperçu plusieurs fois), votre exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import sqlite3
     
    connection = sqlite3.connect('SQLite3/Esperance.db')
    cursor = connection.cursor()
     
    values = (0, 1, 1)
    result = cursor.execute("SELECT Ordre FROM Ordres WHERE T_ext = ? AND Prog = ? AND Heure = ?", values)
    print(result.fetchone()[0])
    a toutes les chances de fonctionner, mais ne s'applique pas (me semble-t-il) pour faire ce que je veux : il s'agit bel et bien d'interroger ma table à partir des valeurs de variables, pas de constantes.

    Je veux bien que chapGPT m'ait dit des carabistouilles, mais le but auquel j'aspire, c'est que SQLite me dise quel est le contenu de ma table pour les valeurs qui sont dans mes variables (et qui viennent de tout à fait ailleurs), ou qu'il n'y a pas de réponse pour ces valeurs là, dans ma table. Je ne vois pas quel intérêt il pourrait y avoir pour mon projet à interroger ma tables avec des constantes, et non pas tel ou tel jeu de constantes.

    Estimez-vous, l'un ou l'autre, que la solution proposée par ChatGPT n'est pas bonne ? Mais alors, quelle est la bonne. Je reconnais que je n'ai pas une compétence suffisante en Python pour répondre moi-même, et pas d'autre compétence que de tester si les solutions qu'on me propose fonctionnent.


    Et accessoirement, je n'apprécie pas beaucoup qu'on ait l'air de me dire que cette façon de fonctionner ait quoi que ce soit de répréhensible.

  14. #14
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    a toutes les chances de fonctionner, mais ne s'applique pas (me semble-t-il) pour faire ce que je veux
    C'est un principe, ça s'applique donc à tout ce que vous souhaitez, remplacez values où se trouve des valeurs par des noms de variables contenant des valeurs, ça revient stricto au même...

    il s'agit bel et bien d'interroger ma table à partir des valeurs de variables, pas de constantes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    valeurs=('T_Ext','T_Amb','Prog','Heure','Etat')
    requete=(
        "SELECT Ordre FROM Ordres "
        "WHERE T_Ext = ? "
        "AND T_Amb =? "    
        "AND Prog =? "    
        "AND Heure =? "   
        "AND Etat =?"
        ) 
     
    cursor.execute(requete, valeurs)
    Concentrez vous sur votre variable valeurs qui ne contient pas des variables, mais des chaînes de caractères.

    Pour être plus clair, valeurs=('T_Ext','T_Amb','Prog','Heure','Etat') différent de valeurs=(T_Ext, T_Amb, Prog, Heure, Etat), voyez vous la nuance ?

  15. #15
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 321
    Par défaut
    bonjour

    problème mystérieux
    pas vraiment, il faut juste savoir que le chat a le même QI qu'un chien ! C'est juste un outil, mais certainement pas un codeur.

    rien de bon dans ce retour du chat , mais c'est normal, puisque tu ne connais pas, tu ne peux pas bien affiner ta demande.
    Je suppose que grâce au chat, tu penses te passer de lire la doc, et voici le résultat

    fred1599 dans le message précédent sur valeurs est clair ! Pour une personne qui dit déjà coder avec d'autres langages, il est grave de confondre une chaine de caractère avec une variable Dire que c'est le chat qui a fait l'erreur ne change rien, si on ne peut voir une telle absurdité du chat alors, on ne peut pas l'utiliser.

    Ici, le (vrai) problème est que tu désires passer la requete sql en log, un minimum était de demander au chat de créer une autre chaine (variable requete) car c'est la fonction execute() qui doit créer cette chaine sql. Perso, j'utilise une autre méthode, mais le chat lui n'est pas trop réveillé... (ou plutôt: le chat n'est en fait PAS Intelligent )

    Un petit simulateur pour t'entrainer :
    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
    #!/usr/bin/env python
    import sqlite3
    import random
    from functools import partial
     
    def log(sortie=None, sql="?"):
        print(f"  #requete SQL: {sql}", file=sortie) # dans un fichier ou écran
     
    fp = open("log.txt", "a") #fp = None # pour sortie écran
    con = sqlite3.connect(":memory:")
    cur = con.cursor()
    con.set_trace_callback(partial(log, fp))   # pour tes logs vers un truc
     
    for x in range(5):
        chaleur = random.randint(0, 25)
        heure = random.randint(0, 25)
        etat = bool(random.randint(0, 1))
        values = (heure, chaleur, etat) # je ne confonds pas variable et texte ;)
     
        cur.execute("SELECT ?, ?, ?", values)   # c'est a sqlite de créer la chaine JAMAIS a nous
        print("résultat de la requete:", cur.fetchone())
    =============
    les while en cascade du chat c'est en fait : for variable in range(0, limite)

  16. #16
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    @papajocker Je te trouve sévère. J'ai cherché de la doc, mais je n'ai pas trouvé grand chose d'opérationnel. Ce n'est pas de la philosophie, que je cherche, et pas de l'anglais non plus : je sais le lire, mais je ne suis pas assez "fluent" pour assimiler en même temps. "Le chat a l'intelligence d'un chien" : je n'en suis même pas sûr, mais il a beaucoup plus de mémoire, et de toutes façons, ça n'est pas vraiment la question : les renseignements qu'il m'a donnés m'ont quand même mis le pied à l'étrier, et, quoi que vous en disiez, plus vite que si j'avais dû le faire par la doc. Mais bon. Si je n'avais pas conscience de ses limites, je ne serais pas ici.

    Quoi qu'il en soit, au moins trois personnes me répondent, et je ne vais pas m'en plaindre, je vous remercie. Mais en attendant, je ne dis pas que vos renseignements ne sont pas bons, mais j'ai du mal à les assimiler. J'ai l'impression qu'il y a plusieurs façons de rédiger les requêtes, plusieurs façons de faire correspondre les variables de mon code avec les arguments de la requête que je prépare : quelqu'un peut-il me procurer les références d'une documentation claire et précise sur le sujet, SVP ?

    Et merci d'avance.

    AMIcalement.

  17. #17
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 321
    Par défaut
    Citation Envoyé par L'AMI Yves Voir le message
    J'ai l'impression qu'il y a plusieurs façons de rédiger les requêtes, plusieurs façons de faire correspondre les variables de mon code avec les arguments de la requête que je prépare
    La réponse est simple NON

    Tu disais pourtant avec déjà de l'expérience en code ?
    C'est le même mécanisme pour toutes les bases de données et donc pour tous les langages !!!!

    Existe une seule bonne conduite. Par contre, le web pullule de mauvaises pratiques et le chat lui ne doit pas savoir faire la différence...
    Existe 500 000 références si on cherche sur le web

    exemple:
    N’utilisez jamais les opérations liées aux chaînes Python pour formuler des requêtes SQL dynamiques dans votre programme Python.
    C'est pourtant simple

    autre:
    Paragraphe "Mauvaises techniques" ... Je te laisse lire
    Bonne technique
    Il faut plutôt utiliser une technique qu'on appelle les requêtes paramétrées.
    La technique consiste à placer un point d'interrogation à la place de chacune des variables dans la requête.
    ===============

    Citation Envoyé par L'AMI Yves Voir le message
    les renseignements qu'il m'a donnés m'ont quand même mis le pied à l'étrier, et, quoi que vous en disiez, plus vite que si j'avais dû le faire par la doc
    Oui ! mais il faut voir le résultat : tout est faux dans ce code : il te donne un code qui "marchouille" mais avec un condensé de choses que tu dois absolument oublier si tu désires progresser. Si tu désires uniquement que "cela marche" alors ok

  18. #18
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    Par défaut
    Citation Envoyé par L'AMI Yves Voir le message
    J'ai l'impression qu'il y a plusieurs façons de rédiger les requêtes, plusieurs façons de faire correspondre les variables de mon code avec les arguments de la requête que je prépare : quelqu'un peut-il me procurer les références d'une documentation claire et précise sur le sujet, SVP ?
    Le truc de départ n'est pas si faux et modulo ce que j'y ai marqué ligne 10(.replace('?', '%s')), ceci devrait fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                        # Recherche de l'ordre à donner dans la table Ordres
                            requete=(
                                "SELECT Ordre FROM Ordres "
                                "WHERE T_Ext = ? "
                                "AND T_Amb =? "    
                                "AND Prog =? "    
                                "AND Heure =? "   
                                "AND Etat =?"
                             )
                            sql_query = (requete.replace('?', '%s') % valeurs)
                            with open("espion1.txt", 'a') as espion:
                                espion.write("Requête SQL : ",sql_query)
                            cursor.execute(requete, valeurs)
                            Ordre=cursor.fetchone()
    après dans un forum de discussion, ça bavarde...

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

  19. #19
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 321
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Le truc de départ n'est pas si faux et modulo ...., ceci devrait fonctionner
    Ca marche, ok mais, le code ci dessus ne donne pas dans tous les cas la requête exacte (guillemets, échappements).
    avec trace_callback, au moins je suis sûr. je peux obtenir en changeant par exemple la dernière valeur pour un cur.execute("SELECT ?, ?, ?", values):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #requete SQL: SELECT 16, 10, 'truc'
    #requete SQL: SELECT 23, 20, 't''ruc'
    ==========
    Note
    Il est plus simple et plus lisible d'écrire le squelette de la requête sql sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        requete = """
                SELECT Ordre FROM Ordres 
                  WHERE Prog = ?
                    AND Heure = ?
                    AND Etat = ?
                """

  20. #20
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    les renseignements qu'il m'a donnés m'ont quand même mis le pied à l'étrier, et, quoi que vous en disiez, plus vite que si j'avais dû le faire par la doc.
    Des renseignements où vous n'avez pas les compétences pour les vérifier. Si vous ne maîtrisez pas le langage python et SQL, votre questionnement à chatGPT sera imprécis et donc sa réponse le sera tout autant.

    Vous pouvez tester sa proposition et lorsque cela ne fonctionne pas venir ici poser vos questions, mais cette pratique a ses limites, car au fur et à mesures que votre développement avancera, les réponses seront de plus en plus complexes et les questions des membres pour en savoir plus, de plus en plus techniques.

    Perso, je n'ai pas regardé la partie technique de l'erreur, simplement j'ai vu que vous filtriez votre recherche à l'aide de chaînes de caractères au lieu de valeurs entières, c'est une erreur de concept... et c'est pour cela que j'ai essayé de vous faire comprendre ce que vous faisiez plutôt que de faire une simple correction de syntaxe, le but étant de vous amener à trouver la réponse et comprendre ce que cherchiez à faire.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 7
    Dernier message: 18/04/2008, 20h07
  2. Embarque un interpreteur Python dans une appli C++
    Par romeo9423 dans le forum MFC
    Réponses: 1
    Dernier message: 01/12/2005, 10h52
  3. Réponses: 4
    Dernier message: 19/10/2005, 09h20
  4. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 13h51

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