Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme SQL

Probleme avec le module MySQLdb

Sujet résolu
    4 février 2015 à 18:51:49

    bonjour, 

    voici mon problème, je bosse avec le module MySQLdb et je souhaite exécuter une requête "dynamique", avec comme variable le nom de la table et 2 autres variables. j'ai déjà essayé le programme suivant 

    #!/usr/bin/python3.2
    # -*-coding:Utf-8 -*
    #/home/pi/Desktop/PPD/V1.py
    
    
    import smbus
    import time
    import MySQLdb as mdb
    
    con  = mdb.connect("localhost","root","test","PPD")
    
    
    bus = smbus.SMBus(1)
    addr = 0x12
    
    
    while 1:
    	#data = ""
    	#for x in range(0,60):
    	#	try:
    	#		data += chr(bus.read_byte(addr)) ;
    	#	except IOError, e:
    	#		print e
        data = "tempext=20;tempint=10;humsol=20;humair=10;lum=1000;niveau=1"
    	listval = data.split(';')
    	print (listval)
    
    	date = time.time()
    	date = int (date)
    
    	for i in range(len(listval)):
    		chaine = listval[i]
    		li = chaine.split('=')
    		li[1]=int(li[1])
    
            cur=con.cursor()
            query ="INSERT INTO %s(dates,valeur) VALUES (%s,%s)"
            cur.execute(query)
    
    
    
    	time.sleep(5);
    

    Mais je tombe sur l'erreur suivante: 

    pi@raspberrypi ~ $ python /home/pi/Desktop/PPD/V1.py
    ['tempext=20', 'tempint=10', 'humsol=20', 'humair=10', 'lum=1000', 'niveau=1']
    Traceback (most recent call last):
      File "/home/pi/Desktop/PPD/V1.py", line 38, in <module>
        cur.execute("INSERT INTO %s(dates,valeur) VALUES (%s,%s)",(li[0],date,li[1]))
      File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
        self.errorhandler(self, exc, value)
      File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
        raise errorclass, errorvalue_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''tempext'(dates,valeur) VALUES (1423069060,20)' at line 1")

    merci d'avance :)


    -
    Edité par bearcorrupted 22 août 2022 à 23:24:09

    • Partager sur Facebook
    • Partager sur Twitter
      4 février 2015 à 21:52:12

      C'est probablement un petit soucis de copier-coller sur le site, mais ta ligne 37 ne contient pas de tuple avec les variable que tu veux placer dans ta chaîne de caractère.

      • Partager sur Facebook
      • Partager sur Twitter
        4 février 2015 à 22:25:07

        Autant pour moi, je n'avais pas vu, voici ma nouvelle requête:

        cur=con.cursor()
        query ="INSERT INTO %s(dates,valeur) VALUES (%s,%s)"
        cur.execute(query,[li[0],date,li[1]])

        et voici l'erreur:

        pi@raspberrypi ~ $ python /home/pi/Desktop/PPD/V1.py
        ['tempext=20', 'tempint=10', 'humsol=20', 'humair=10', 'lum=1000', 'niveau=1']
        Traceback (most recent call last):
          File "/home/pi/Desktop/PPD/V1.py", line 38, in <module>
            cur.execute(query,[li[0],date,li[1]])
          File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
            self.errorhandler(self, exc, value)
          File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
            raise errorclass, errorvalue
        _mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''tempext'(dates,valeur) VALUES (1423084810,20)' at line 1")






        -
        Edité par bearcorrupted 4 février 2015 à 22:25:35

        • Partager sur Facebook
        • Partager sur Twitter
          4 février 2015 à 23:25:30

          Il semblerait qu'il te manque un espace entre le nom de la table et les parenthèses contenant les noms des colonnes. Une chose qui paraît étrange dans le message d'erreur est la parie de guillemets qui entourent tempext. Pourtant avec l'exemple de code que tu donnes là, ça devrait être bon.

          • Partager sur Facebook
          • Partager sur Twitter
            5 février 2015 à 13:13:11

            J'ai l'habitude de sqlite3 personnellement mais ça ne marcherait pas de faire un truc comme ce qui suit ?

            cur=con.cursor()
            query ="INSERT INTO %s(dates,valeur) VALUES (%s,%s)" %(li[0],date,str(li[1]))
            cur.execute(query)



            • Partager sur Facebook
            • Partager sur Twitter
              5 février 2015 à 19:29:32

              Merci,Jevanni, le programme fonctionne, aucune erreur, à l’exception que ma BDD ne change pas! Si vous avez une suggestion je suis preneur.

              -
              Edité par bearcorrupted 5 février 2015 à 19:30:37

              • Partager sur Facebook
              • Partager sur Twitter
                6 février 2015 à 15:00:30

                Ok, je n'étais pas sûr pour ta version de sql utilisée mais c'est sûrement le même trick que pour sqlite3 :

                # quand tu fais un insert ou un create table, cette structure est necessaire :
                
                with con :
                   cur = con.cursor()
                   query = "..."
                   cur.execute(query)
                
                # puis la suite apres en dehors du with
                
                


                Quand tu ne fais que récupérer des infos, avec un select par exemple, tu peux te passer de cette structure et faire comme avant.

                -
                Edité par Jevanni 6 février 2015 à 15:01:07

                • Partager sur Facebook
                • Partager sur Twitter
                  8 février 2015 à 20:02:51

                  Merci beaucoup, ça fonctionne. :)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Probleme 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