Partage
  • Partager sur Facebook
  • Partager sur Twitter

Sqlite3 - Erreur lors de requête SQL

    18 février 2022 à 10:24:40

    Bonjour, je viens vers ce qui peuvent me permettre non seulement de résoudre mon problème, mais aussi de le comprendre.

    J'essaye d'exécuter une requête dont des informations sont données par un utilisateur employant le programme, j'utilise donc les "?" tel que ceci 

    def executerequestIndi(cursor, entryA, entryB):
        requete = '''SELECT ? FROM Individu'''
        A = entryA.get()
        B = entryB.get()
        cursor.execute(requete, [A])
        print(cursor.fetchall())

    Comme vous le voyez ci-dessus, l'attribut donné par l'utilisateur est get et il est exécuté dans la requête, mais le problème est que cela me retourne ceci :

    "[('nom',), ('nom',), ('nom',)]"

    J'ai par ailleurs essayé les "?" pour sélectionner la table par l'utilisateur, mais là le programme ne le supporte simplement pas. Quoi qu'il en soit pouvez-vous m'aider dans le cadre de mon problème lié à l'attribut ?

    Au faite, j'ai oublié de dire que le return que j'ai [('nom',), ('nom',), ('nom',)] est dans la mesure où l'attribut donné par l'utilisateur est "nom". Or ma base de donnée comporte trois tupples. Les véritables noms des tupples sont remplacés.

    Merci d'avance, cordialement.

    -
    Edité par Entys_Drawing 18 février 2022 à 10:26:42

    • Partager sur Facebook
    • Partager sur Twitter
      19 février 2022 à 18:19:38

      Bonjour,

      Je ne connais pas trop Python, mais côté SQL le résultat est normal.

      Ce que tu fais reviens à exécuter la requête suivante :

      SELECT "nom"
      FROM Individu

      Donc cette requête retourne la chaîne "nom" pour chaque enregistrement de la table Indiviu.

      On ne peut pas préparer des requêtes avec des noms de table ou de colonne. Si c'est vraiment ce que tu veux faire (avoir un nom de colonne variable), alors il faut concaténer la chaîne SQL avant de l'exécuter. Mais cela est une mauvaise pratique, et soulève d'ailleurs la question du pourquoi vouloir passer le nom des colonnes en paramètre ?

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        23 février 2022 à 12:14:13

        la table c'est dans le FROM du SELECT:

        SELECT [colones] FROM [table] 

        Sinon ton retour est bien 3 tuples: ("nom",) est un tuple.
        Si ta colonne s'appelle "nom" et que l'on te retourne la liste [('nom1',),('nom2',),('nom3',)] c'est que la requête à fonctionner à mon avis. Si tu t'attendais à [('nom1','prenom1'),('nom2','prenom2'),('nom3','prenom3')]; c'est peut-être l'enregistrement des prénoms qui n'a pas fonctionné.

        (j'ai essayé de deviner ce que tu voulait obtenir comme résultat au final, parce que ce n'était pas très clair)

        • Partager sur Facebook
        • Partager sur Twitter
          23 février 2022 à 13:50:18

          En fait dans sa table il a :

          Table Individu
          nomcolonne 2colonne 3
          Pierre Toto 50
          Paul Tutu 100
          Jacques Tata 10

          Et il voudrait obtenir :

          nom
          Pierre
          Paul
          Jacques

          Cela avec un SELECT où le nom de la colonne est variable :

          SELECT ? FROM Individu

          Or avec cette syntaxe, Python va générer le SQL suivant :

          SELECT "nom" FROM Individu

          Ce qui n'est pas la même chose que :

          SELECT nom FROM Individu

          Preuve, si l'on fait manuellement :

          SELECT nom, "nom" FROM Individu

          Nous obtiendrons :

          nom"nom"
          Pierre nom
          Paul nom
          Jacques nom

          Cette "protection" des variables est en place pour se protéger des injections SQL, et c'est normal.

          Benzouye a écrit:

          Cela est une mauvaise pratique, et soulève d'ailleurs la question du pourquoi vouloir passer le nom des colonnes en paramètre ?

          -
          Edité par Benzouye 23 février 2022 à 13:52:59

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

          Sqlite3 - Erreur lors de requête SQL

          × 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