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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    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 323
    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)

  2. #2
    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.

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    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 323
    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

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    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

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    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 323
    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 = ?
                """

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Décidément, Brassens avait raison : "les braves gens n'aiment pas que l'on suive une autre route qu'eux !". J'ai donné ma langue au chat ? Et alors... Je viens sur un forum technique pour poser une question technique. Je ne dis pas qu'on ne me répond pas, mais on ne répond pas à la question que je pose. Il faut que j'explique pourquoi je le fais, pourquoi je le fais comme ça, j'ai eu tort de ceci, et aussi de cela. Et moi, en plus, je réponds ! Quelle débauche d'énergie pour faire tourner le réseau...

    Oui, le chat m'a donné une mauvaise réponse. Oui, je ne connais que des rudiments de Python. En particulier, il y a deux connaissances qui me manquent : la façon de faire des substitutions en Python, et la façon de coder les instruction en SQLite. LA seule chose raisonnable qu'on aurait dû me répondre, c'était comment le faire, ou me donner des références de documents qui l'expliquent.

    Quelle importance cela a-t-il que j'explique ce que je veux faire, par quel chemin j'en suis arrivé à ce que j'ai essayé etc...

    Je re-pose mon problème : j'ai une situation symbolisée par cinq variables. J'ai un dispositif qui peut faire évoluer cette situation en agissant sur une sixième variable, et j'ai une stratégie matérialisée dans une table SQLite, qui, pour chaque ensemble de valeurs "possibles" de les cinq variables, dit quelle valeur doit prendre la sixième.
    Je vous ai montré ce que j'ai tenté de faire : ça ne marche pas. Pouvez-vous m'indiquer comment faire SVP ?

  7. #7
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    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 323
    Par défaut
    Citation Envoyé par L'AMI Yves Voir le message
    Je re-pose mon problème : ... j'ai une stratégie matérialisée dans une table SQLite, qui, pour chaque ensemble de valeurs "possibles" de les cinq variables, dit quelle valeur doit prendre la sixième.
    Donc en fait tout ce code c'est pour ajouter un champ calculé par la suite ?
    Si c'est ton besoin, alors il fallait peut-être poser la question dans le forum SQL... (voir une IA)

    reference GENERATED VIRTUAL

    Sinon, ton "ajout d'un champ" peut aussi être fait dans ta requete SELECT a, b, c, Je_Genere_une_valeur_calculée_SUIVANT_a as d WHERE a<3 and b<3 and c<2
    Et avec WHERE, on évite tes "while" python en cascade ?

    EDIT:
    petit code pour illustrer une colonne calculée suivant ces 2 techniques :
    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
    #!/usr/bin/env python
    import sqlite3
    import random
     
    requete = """
            CREATE TABLE Ordres (
                    T_Ext INTEGER,
                    T_Amb INTEGER,
                    Prog INTEGER,
                    Heure INTEGER,
                    Etat INTEGER,
                    Ordre INTEGER,
                    calcul INT GENERATED ALWAYS AS (CASE Ordre WHEN 0 THEN "0" WHEN 2 THEN "?" ELSE "x" END) VIRTUAL
                );
            """
    """
    utiliser ALTER TABLE ADD COLUMN si table existe déjà pour ajouter la colonne "calcul"
    """
     
    con = sqlite3.connect(":memory:")
    cur = con.cursor()
     
    cur.execute(requete)
    for _ in range(12):
        cur.execute(
            "INSERT INTO Ordres VALUES(?,?,?,?,?,?);",
            (
                random.randint(0,3),
                random.randint(0,3),
                random.randint(0,2),
                random.randint(0,2),
                random.randint(0,1),
                random.randint(0,1),
            )
        )
     
    print("Add colonne 'calcul' calculée par la structure")
    cur.execute("SELECT * FROM Ordres")
    for item in cur.fetchall():
        print(*item)
     
    print("-"*12,"\nAdd colonne 'x' de plus mais par select")
    print("-"*12)
    cur.execute("""
        SELECT *,IIF(Ordre == 1, 'Oui', 'Non') as x
        FROM Ordres
        WHERE T_Ext < 3 AND T_Amb < 3
        ORDER BY calcul,x
        """
    )
    print(*(f"{l[0]:>6}" for l in cur.description))
    for item in cur.fetchall():
        print(*(f"{i:>6}" for i in item))
    Utilisation une fois de CASE et autre de IFF : c'est juste pour la démo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     T_Ext  T_Amb   Prog  Heure   Etat  Ordre calcul      x
         1      2      0      0      0      0      0    Non
         0      2      1      1      0      0      0    Non
         0      0      2      1      1      0      0    Non
         0      1      0      1      0      1      x    Oui

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    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 2 sur 2 PremièrePremière 12

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