Partage
  • Partager sur Facebook
  • Partager sur Twitter

envoi requete dans une Class

ValueError: operation parameter must be str

Sujet résolu
    5 avril 2020 à 20:38:40

    Bonjour

    Quand j'envoie une requete simple (req = ("SELECT * FROM Mouvements") dans la  "class Database" cela fonctionne

    Quand j'envoie une requete simple (req = ("SELECT * FROM Mouvements where coche_pointage = ? ",(0,))) dans la  "class Database" cela ne  fonctionne pas avec un message d'erreur (ValueError: operation parameter must be str)

    Merci d'avance pour vos réponses

    import sqlite3
    
    class Database:
    
    
        def __init__(self):
           
            self._conn = sqlite3.connect("essais.db")
            self._cursor = self._conn.cursor()
           
        def __enter__(self):
             return self
           
        def __exit__(self, exc_type, exc_val, exc_tb):
             self.commit()
             self.connection.close()
    
        def connection(self):
              return self._conn
           
        def cursor(self):
              return self._cursor
           
        def commit(self):
              self.connection.commit()
             
        def execute(self,req,nbr):
           
            self._cursor.execute(req)
           
            if nbr == 2 :
                return self.fetchall()
            else :
                return self.fetchone()
    
        def fetchall(self):
              return self._cursor.fetchall()
    
        def fetchone(self):
            return self._cursor.fetchone()
    
    
    
        def query(self, sql, params=None):
                self.cursor.execute(sql, params or ())
                return self.fetchall()   
    
    # cette requete fonctionnn
    
    req = ("SELECT * FROM Mouvements")
    
    # cette requete ne fonctionne
    
    req = ("SELECT * FROM Mouvements where coche_pointage = ? ",(0,))
    
    # message d'erreur
    ValueError: operation parameter must be str
    
    # envoi de la requete dans la class
    li = Database().execute(req,2)
    print("li",li)



    • Partager sur Facebook
    • Partager sur Twitter
      5 avril 2020 à 23:24:42

      Oui on te dit que req n'est pas une chaîne de caractères, regarde l'exemple de la doc pour adapter

      t = ('RHAT',)
      c.execute('SELECT * FROM stocks WHERE symbol=?', t)



      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        6 avril 2020 à 8:10:37

        Merci pour la réponse, mais ça ne marche

        Si je ne passe  pas  par la class, ma requête  fonctionne

        • Partager sur Facebook
        • Partager sur Twitter
          6 avril 2020 à 8:45:14

          EDIT: En fait la méthode execute sur sqlite3 prend un paramètre ou plusieurs paramètres supplémentaires, mais tu choisis dans ta classe de ne pas l'utiliser.

          Seulement dans l'exécution de ta méthode execute dans Database, tu y ajoutes un paramètre.

          Va falloir que tu te mettes d'accord avec toi même...

          -
          Edité par fred1599 6 avril 2020 à 8:52:10

          • Partager sur Facebook
          • Partager sur Twitter

          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

            6 avril 2020 à 9:13:00

            <<Seulement dans l'exécution de ta méthode execute dans Database, tu y ajoutes un paramètre.>>

            le paramètre sert à  différencié le  resulat pour fetchone ou fetchall

            Mais je viens de tester ma requête en deux morceaux et cela fonctionn

            req = ("SELECT * FROM Mouvements where coche_pointage = ? ")
            arg=(0,)
            Je change :
            def execute(self,req,nbr,arg):
                           
                    self._cursor.execute(req,arg)
                   
                    if nbr == 2 :
                        return self.fetchall()
                    else :
                        return self.fetchone()

            • Partager sur Facebook
            • Partager sur Twitter
              6 avril 2020 à 9:33:35

              Wep c'est de ça exactement que je parlais, mais pour rester cohérent, c'est un conseil, met arg avant nbr, comme ça tu gardes l'ordre naturel de la méthode execute. Sinon tu risques de te perdre sur des petits détails stupides.
              • Partager sur Facebook
              • Partager sur Twitter

              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                6 avril 2020 à 10:09:36

                Merci pour ton conseil. cela parait plus logique et plus facile pour la lecture.

                Encore MERCI

                • Partager sur Facebook
                • Partager sur Twitter

                envoi requete dans une Class

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown