Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur : IndexError: tuple index out of range

Sujet résolu
    24 décembre 2016 à 16:25:51

    Bonjour, après quelques heures de recherche je me permets de demander de l'aide sur le forum j'ai une erreur de tuple index out of range et je n'arrive pas à savoir pourquoi voici mon code ou cela se produit

    # -*- coding: utf-8 -*-
    import sqlite3
    import json
    
    #Methode qui retourne toutes les données de la table Offre de la BDD au format JSON
    def getOffers():
        conn = sqlite3.connect('AreAppSqlBase.db')
        cursor = conn.cursor()
        cursor.execute(""" SELECT * FROM Contact """)
        resultCmd = cursor.fetchall()
        Offres = []
        for Offre in resultCmd:
            offreDict = {
                'OfferID': Offre[0],
                'Titre': Offre[1],
                'Durée' : Offre[2],
                'Contrat' : Offre[3],
                'FormationAssociée' : Offre[4],
                'Etat' : Offre[5],
    
                #Err ce produit sur cette ligne
                'Details' : Offre[6],
                #Err ce produit sur cette ligne
    
                'DetailsResponsable' : Offre[7],
                'DatePublication' : Offre[8],
                'ContactRef' : Offre[9]}
            Offres.append(offreDict)
        return json.dumps(Offres)
        conn.close()
    
    #Cette methode fonctionne alors que c'est quasiment la même
    #Methode qui retourne une offre en fonction de son ID au format JSON
    def getOfferById(idOffer):
        REQUETE_GET_OFFER_BY_ID = "SELECT * FROM Offre WHERE OfferID = %d" % idOffer
        conn = sqlite3.connect('AreAppSqlBase.db')
        cursor = conn.cursor()
        cursor.execute(REQUETE_GET_OFFER_BY_ID)
        resultCmd = cursor.fetchall()
        Offres = []
        for Offre in resultCmd:
            offreDict = {
                'OfferID': Offre[0],
                'Titre': Offre[1],
                'Durée' : Offre[2],
                'Contrat' : Offre[3],
                'FormationAssociée' : Offre[4],
                'Etat' : Offre[5],
                'Details' : Offre[6],
                'DetailsResponsable' : Offre[7],
                'DatePublication' : Offre[8],
                'ContactRef' : Offre[9]}
            Offres.append(offreDict)
        return json.dumps(Offres)
        conn.close()
    

    Le message d'erreur :

    Traceback (most recent call last):
      File "C:\Program Files (x86)\Python35-32\lib\site-packages\flask\app.py", line 1982, in wsgi_app
        response = self.full_dispatch_request()
      File "C:\Program Files (x86)\Python35-32\lib\site-packages\flask\app.py", line 1614, in full_dispatch_request
        rv = self.handle_user_exception(e)
      File "C:\Program Files (x86)\Python35-32\lib\site-packages\flask\app.py", line 1517, in handle_user_exception
        reraise(exc_type, exc_value, tb)
      File "C:\Program Files (x86)\Python35-32\lib\site-packages\flask\_compat.py", line 33, in reraise
        raise value
      File "C:\Program Files (x86)\Python35-32\lib\site-packages\flask\app.py", line 1612, in full_dispatch_request
        rv = self.dispatch_request()
      File "C:\Program Files (x86)\Python35-32\lib\site-packages\flask\app.py", line 1598, in dispatch_request
        return self.view_functions[rule.endpoint](**req.view_args)
      File "app.py", line 37, in OffersList
        return getOffers()
      File "C:\Users\Maxime\Google Drive\IMERIR_COURS\GRABOLOSA_Pierre\SERVICEWEB_AREAPP_BOUILLON_SIREV0.0.1\offre.py", line 20, in getOffers
        'Details' : Offre[6],
    IndexError: tuple index out of range

     Merci d'avance :)
    Joyeux Noël :D

    EDIT : Si ça peut aider voici une capture des données présentes dans ma table !


    EDIT 2 : Je viens de faire la même fonction mais qui reçoit plus de données avec une autre requête et la ça fonctionne.... Je comprends vraiment rien la...

    #Methode qui retourne toutes les données de la table Offre avec les détails du contact associé de la BDD au format JSON
    def getOffersLinkedWithContact():
        conn = sqlite3.connect('AreAppSqlBase.db')
        cursor = conn.cursor()
        cursor.execute(""" SELECT * FROM Offre INNER JOIN Contact ON ContactRef = ContactID """)
        resultCmd = cursor.fetchall()
        OffresLinkedWithContact = []
        for OffreContact in resultCmd:
            offreContactDict = {
                'OfferID': OffreContact[0],
                'Titre': OffreContact[1],
                'Duree' : OffreContact[2],
                'Contrat' : OffreContact[3],
                'FormationAssociee' : OffreContact[4],
                'Etat' : OffreContact[5],
                'Details' : OffreContact[6],
                'DetailsResponsable' : OffreContact[7],
                'DatePublication' : OffreContact[8],
                'ContactRef' : OffreContact[9],
                'ContactID' : OffreContact[10],
                'NomContact' : OffreContact[11],
                'NomEntreprise' : OffreContact[12],
                'Lieu' : OffreContact[13],
                'ContactMail' : OffreContact[14],
                'ContactPhone' : OffreContact[15]}
            OffresLinkedWithContact.append(offreContactDict)
        return json.dumps(OffresLinkedWithContact)
        conn.close()
    



    -
    Edité par b0uill0n66 24 décembre 2016 à 17:09:41

    • Partager sur Facebook
    • Partager sur Twitter

    Licence Pro Dev Mobile  - Apprenti Manager Systèmes Informatiques et Robotiques, IMERIR Perpignan

      27 décembre 2016 à 21:11:10

      Salut,

      Si cela peux vous aidez, vous pouvez arrêter l'utilisation de tuple et prendre des clefs dictionnaires.

      Avec cette commande très chouette :)

      conn.row_factory = sqlite3.Row

      Voici un exemple:

      #!/usr/bin/python3
      # -*- coding:utf-8 -*-
      
      import sqlite3
      import json
      
      def createOffre(dbFile):
          conn = sqlite3.connect(dbFile)
          with conn:
              cursor = conn.cursor()
              cursor.execute(""" CREATE TABLE Contact(Id INT, Titre TEXT, Nombres INT) """)
              cursor.execute(""" INSERT INTO Contact VALUES(1, 'Salut', 10) """)
              cursor.execute(""" INSERT INTO Contact VALUES(2, 'Reines', 11) """)
              cursor.execute(""" INSERT INTO Contact VALUES(3, 'Farfadet', 1) """)
              cursor.execute(""" INSERT INTO Contact VALUES(4, 'Aurevoir', 3) """)
              cursor.execute(""" INSERT INTO Contact VALUES(5, 'Bonjour', 6) """)
              cursor.execute(""" INSERT INTO Contact VALUES(6, 'Joyeuse', 7) """)
              cursor.execute(""" INSERT INTO Contact VALUES(7, 'Fetes', 1) """)
              cursor.execute(""" INSERT INTO Contact VALUES(8, 'Allo', 4) """)
              cursor.execute(""" INSERT INTO Contact VALUES(9, 'Coucou', 8) """)
              
              
      def getOffre(dbFile):
          conn = sqlite3.connect(dbFile)
          with conn:
              conn.row_factory = sqlite3.Row #Ici très important
              
              cursor = conn.cursor()
              cursor.execute(""" SELECT * FROM Contact """)
              resultCmd = cursor.fetchall()
              Offres = []
              for Offre in resultCmd:
                  print(Offre["Id"], Offre["Titre"], Offre["Nombres"])
                  
      
      dbfile = 'Salut.db3'
      createOffre(dbfile)         
      getOffre(dbfile)


      Bonne chance

      A+

      -
      Edité par nolimitech 27 décembre 2016 à 21:12:01

      • Partager sur Facebook
      • Partager sur Twitter
        27 décembre 2016 à 22:05:54

        Merci beaucoup je vais essayer ça quand je rentrerai chez moi ! Je reviens vite pour donner mon résultat :)
        • Partager sur Facebook
        • Partager sur Twitter

        Licence Pro Dev Mobile  - Apprenti Manager Systèmes Informatiques et Robotiques, IMERIR Perpignan

          2 janvier 2017 à 10:24:36

          Bonjour,

          Toujours une erreur.. Même avec votre méthode... Je ne comprends pas vraiment mais je crois que je vais me passer de cette fonction car pour mon application finale je n'ai besoin que de getOffersLinkedWithContact() (Qui lui fonctionne alors que c'est un copié collé de getOffers() qui ne fonctionne pas) :D

          Voici mon code

          #Methode de test pour utilisation des clefs dictionnaires # ERREUR IndexError: No item with that key -> Sur le json.dumps
          def getOffres():
              conn = sqlite3.connect('AreAppSqlBase.db')
              with conn:
                  conn.row_factory = sqlite3.Row
                  cursor = conn.cursor()
                  cursor.execute(""" SELECT * FROM Contact """)
                  resultCmd = cursor.fetchall()
                  for Offre in resultCmd:
                      return json.dumps(Offre["OfferID"], Offre["Titre"], Offre["Durée"], Offre["Contrat"], Offre["FormationAssociée"], Offre["Etat"], Offre["Details"], Offre["DetailsResponsable"], Offre["DatePublication"], Offre["ContactRef"])
                      #return json.dumps(Offre[0], Offre[1], Offre[2], Offre[3], Offre[4], Offre[5], Offre[6], Offre[7], Offre[8], Offre[9])

          Voici l'erreur

            File "app.py", line 51, in Offre
              return getOffres()
            File "C:\Users\m.bouillon\Desktop\SERVICEWEB_AREAPP_BOUILLON_SIREV0.0.1\offre.py", line 38, in getOffres
              return json.dumps(Offre["OfferID"], Offre["Titre"], Offre["Durée"], Offre["Contrat"], Offre["FormationAssociée"], Offre["Etat"], Offre["Details"], Offre["DetailsResponsable"], Offre["DatePublication"], Offre["ContactRef"])
          IndexError: No item with that key

           Voila voila merci encore :)

          Bon mon erreur était très simple un de mes professeurs m'a aidé c'est juste que je faisais un select sur ma table contact qui ne contient que 6 Colonnes alors que je demandais à recevoir des données de la table Offre qui en contient 10 donc à partir de la 7 eme colonne il se demandait ou mettre les données. La faute de frappe bien connue que je ne vois jamais.

          Merci pour l'aide.

          -
          Edité par b0uill0n66 2 janvier 2017 à 11:21:26

          • Partager sur Facebook
          • Partager sur Twitter

          Licence Pro Dev Mobile  - Apprenti Manager Systèmes Informatiques et Robotiques, IMERIR Perpignan

          Erreur : IndexError: tuple index out of range

          × 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