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. #21
    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 ?

  2. #22
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par papajoker Voir le message
    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):
    Pour moi, cela n'est pas le sujet.
    On part d'une question sur un message d'erreur avec un code dont l'intention n'était pas d'utiliser trace_callback...
    Après on peut dire que c'est dommage... (et c'est bien de le noter).

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

  3. #23
    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
    Bonjour,

    Pouvez-vous m'indiquer comment faire SVP ?
    On est bien d'accord que votre problème est résolu ?

    Il est résolu par la solution de @wiztricks et l'utilisation de sa méthode replace, puis un autre problème qui arrivera par la suite avec l'erreur de filtre où je vous propose de modifier le contenu de votre liste valeurs en remplaçant leurs éléments par des variables au lieu des chaînes de caractères.

    Si vous avez d'autres erreurs merci de les indiquer, voir mieux, créer un nouveau sujet.

    LA seule chose raisonnable qu'on aurait dû me répondre, c'était comment le faire
    Non, relisez les règles de ce forum, nous ne sommes pas là pour cela, l'objectif de ce forum est d'amener à vous faire comprendre les choses, sinon, des freelances sur diverses plateforme pourront vous aider, mais pas gratuitement.
    Ces remarques sont le seul coût pour vous éviter ces plateformes, à vous de les accepter ou pas...

  4. #24
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    @Fred1599 : D'accord, je me suis mal exprimé : m'expliquer mon erreur.

    tous Merci, je regarde tout ça. J'ai quand-même du mal à trouver mon chemin dans tout ce fatras.

    AMIcalement

  5. #25
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Bon, c'est résolu. Il y avait sans doute d'autres façons de faire, mais laissons tomber.

    A propos de la confusion entre la liste des noms de variables et la liste des variables, j'ai eu un doute et j'ai demandé au chat de confirmer, ce qu'il a fait avec beaucoup d'aplomb en me laissant entendre que c'était l'interface sqlite qui se débrouillait.

    Voici la réponse :
    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
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    import sqlite3
    import os
    import time
    from os import system
    try:
        conn = sqlite3.connect('SQLite3/Esperance.db')
    # Creation d'un objet curseur
        cursor = conn.cursor()
        for T_Ext in range(2):
            for T_Amb in range(3):
                for Prog in range(3):
                    for Heure in range(2):
                        for Etat in range(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 
                            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:d}, "
                                f"{T_Amb:d}, "
                                f"{Prog:d}, "
                                f"{Heure:d}, "
                                f"{Etat:d}, "
                                f"{ordre1:s}\n"
                            )                      
                            with open("espion1.txt", 'a') as espion:
                                espion.write(output_string)
    # 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()
    Merci à tous, et en route pour de nouvelles aventures.

    AMIcalement.

  6. #26
    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
    Tant mieux, du coup sql_query sert à quoi ?

    EDIT : Il existe un bouton Résolu

  7. #27
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 966
    Par défaut
    Citation Envoyé par L'AMI Yves Voir le message
    A propos de la confusion entre la liste des noms de variables et la liste des variables, j'ai eu un doute et j'ai demandé au chat de confirmer, ce qu'il a fait avec beaucoup d'aplomb en me laissant entendre que c'était l'interface sqlite qui se débrouillait.
    ChatGPT n'a pas réellement d'intelligence, il se contente de rechercher des réponses en se basant sur les données qui l'ont nourri.
    Si tu poses une question sans maîtriser ce que tu demandes, tu auras un réponse non maîtrisées, voire complément fausse.

    Pour voir la différence, il suffit d'un simple print.
    Avec un tuple formé avec les nom de variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> valeurs=('T_Ext', 'T_Amb', 'Prog', 'Heure', 'Etat')
    >>> print(valeurs)
    ('T_Ext', 'T_Amb', 'Prog', 'Heure', 'Etat')
    Avec un tuples formé avec le contenu des variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> valeurs=(T_Ext, T_Amb, Prog, Heure, Etat)
    >>> print(valeurs)
    (0, 0, 0, 0, 0)
    Sur ta requête, avec les noms, tu auras ceci qui plantera :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Ordre FROM Ordres WHERE T_Ext = 'T_Ext' AND T_Amb = 'T_Amb' AND Prog = 'Prog' AND Heure = 'Heure' AND Etat = 'Etat'

    Sur ta requête, avec les contenus, tu auras ceci qui s'exécutera :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Ordre FROM Ordres WHERE T_Ext = 0 AND T_Amb = 0 AND Prog = 0 AND Heure = 0 AND Etat = 0

  8. #28
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par L'AMI Yves Voir le message
    et j'ai demandé au chat de confirmer, ce qu'il a fait avec beaucoup d'aplomb en me laissant entendre que c'était l'interface sqlite qui se débrouillait.
    Il est tellement merveilleux ce chat... il permet même de s'éviter à devoir réfléchir. L'univers de 1984 n'est plus très loin...

    Citation Envoyé par L'AMI Yves Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for T_Ext in range(2):
    	for T_Amb in range(3):
    		for Prog in range(3):
    			for Heure in range(2):
    				for Etat in range(2):
    					...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import itertools
    for (T_Ext, T_Amb, Prog, Heure, Etat) in itertools.product(range(2), range(3), range(3), range(2), range(2)):
    	...
    Mais ça tu ne pouvais pas le deviner.

    Citation Envoyé par L'AMI Yves Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with open("temperature.txt", 'a') as fichier:
    	fichier.write ("Erreur SQLite3 : " + e + "\n")
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with open("temperature.txt", 'a') as fichier:
    	print("Erreur SQLite3 : %s" % e, file=fichier)
    Ceci en revanche... Tu aurais lu un tutoriel Python...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #29
    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

+ 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