Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ajout de données dans une base MySQL

Sujet résolu
Anonyme
    11 décembre 2010 à 21:18:36

    Bonjour à tous,

    je suis arrivé à me connecter à la BDD sans trop de problème, mais le problème est que je peux ajouter des chaines de caractères mais pas de variables ...

    import MySQLdb
    
    conn = MySQLdb.connect (host = "localhost",
                           user = "userr",
                           passwd = "",
                           db = "dbname")
    cursor = conn.cursor ()
    cursor.execute ("""
        INSERT INTO wap_post (id, autor)
        VALUES
          ('var[0]', 'Chainedecaracteres')
      """)
    


    l'erreur apparait avec le var[0] mais pas avec le 'Chainedecaracteres'... Vous voyez ce que je veux dire...


    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      11 décembre 2010 à 23:43:02

      Bonjour,

      Je ne vois pas vraiment où est le problème.
      Tu passes une chaîne de caractère, pas une variable.
      Pour mettre une variable dans ta requête, tu peux faire

      cursor.execute ("""
          INSERT INTO wap_post (id, autor)
          VALUES
            ('%s', 'Chainedecaracteres')
        """ % var)
      


      et là, ta variable sera insérée dans la requête.
      Tu n'as vraiment pas dû aller loin dans ton apprentissage de python car la concaténation de chaîne c'est quand même la base...
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        12 décembre 2010 à 0:38:13

        Merci pour ta réponse,

        mais si j'ai plus d'une variable, quelque chose comme ça ne marche pas:

        cursor.execute ("""
            INSERT INTO wap_post (id, autor)
            VALUES
              ('%s', 'Chainedecaracteres', '%s', '%s')
          """ % var, % var 2, % var 3)
        


        ------------

        Autant pour moi, plutôt sous cette forme :


        cursor.execute ("""
            INSERT INTO wap_post (id, autor)
            VALUES
              ('%s', 'Chainedecaracteres', '%s', '%s')
          """ % (var, var 2, var 3))
        


        Merci encore
        • Partager sur Facebook
        • Partager sur Twitter
          12 décembre 2010 à 11:59:21

          Citation : Plug'n'Play 512


          cursor.execute ("""
              INSERT INTO wap_post (id, autor)
              VALUES
                ('%s', 'Chainedecaracteres')
            """ % var)
          




          Attention, ce code est faux.

          L'API de bases de données python convertit automatiquement les types de variables et ajoute les ' et \' qui vont bien, mais pour cela il faut l'utiliser correctement :

          mes_variables = ( 1, 'deux', "j'ai une apostrophe" )
          
          cursor.execute ("""
              INSERT INTO table (col1, col2, col3)
              VALUES (%s, %s, %s)
            """, mes_variables )
          


          Il ne faut pas mettre '%s' mais seulement %s ; conn.execute s'occupe de remplacer les %s par ce qu'il faut, en l'occurence ici, 1, 'deux', 'j\'ai une apostrophe'.

          Note que le SQL avec les %s dedans et mes_variables sont deux paramètres séparés de la fonction cursor.execute( sql, variables ) : il ne faut pas utiliser l'opérateur % pour formater ton SQL, car lui, il ne quote pas les chaînes de caractères...
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            12 décembre 2010 à 13:04:01

            Citation : Lord Casque Noir

            Note que le SQL avec les %s dedans et mes_variables sont deux paramètres séparés de la fonction cursor.execute( sql, variables ) : il ne faut pas utiliser l'opérateur % pour formater ton SQL, car lui, il ne quote pas les chaînes de caractères...



            Oui justement... Y'aurait-il une alternative à %s ? Parce que les ' ou les " ou je ne sais quoi d'autre ne passe pas ...


            Merci
            • Partager sur Facebook
            • Partager sur Twitter
              12 décembre 2010 à 13:20:38

              Qu'est-ce que tu veux dire par "ne passe pas" ? Donne un exemple de code et l'erreur que ça te donne.
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                12 décembre 2010 à 13:30:51

                Ok,

                je print la variable avant de m'occuper du SQL :

                syno (encodée en ISO-8859-1) =

                Citation

                Que se passe-t-il quand Dieu perd foi en l'humanité et envoie une légion d'anges pour exterminer la race humaine ? Un groupe de résistance se constitue en plein désert autour de l'archange Michael...



                ... et l'erreur :

                Citation

                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 'humanit\xe9 et envoie une l\xe9gion d'anges pour exterminer la race humaine ? Un group' at line 3")

                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  12 décembre 2010 à 14:06:45

                  Petite suite du Topic précédent :

                  ...
                  for syno in td:
                        if syno.string <> None:
                            syno2 = syno.string.strip()
                            syno3 = syno3 + syno2
                  		  
                    syno3 = syno3.encode( "iso-8859-1" )
                    
                    conn = MySQLdb.connect (host = "localhost",
                                           user = "userr",
                                           passwd = "",
                                           db = "dbname")
                    cursor = conn.cursor ()
                    cursor.execute ("""
                        INSERT INTO dle_post (short_story)
                        VALUES
                          (%s)
                      """ % syno3)
                  
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 décembre 2010 à 14:14:31

                    Tu n'as pas lu mes messages précédents :p

                    cursor.execute ("""
                          INSERT INTO dle_post (short_story)
                          VALUES
                            (%s)
                        """, (syno3,) )
                    


                    cursor.execute() formate automatiquement les paramètres, à condition de lui donner, et de ne pas les inclure directement dans le SQL avec l'opérateur %...

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      12 décembre 2010 à 14:18:51

                      Aïe! J'ai dû rater un épisode là ...

                      Je suis sensé donc faire quoi ^^' ? ou plutôt, comment donner les paramètres à cursor.execute() ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 décembre 2010 à 14:29:30

                        Citation : anasbud

                        comment donner les paramètres à cursor.execute() ?



                        lis la doc de la DBAPI python ou relis juste mes précédents messages

                        sql = "SQL avec des %s dedans"
                        params = (truc, machin, bidule) # c'est un tuple
                        
                        cursor.execute( sql, params )
                        
                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 décembre 2010 à 17:13:06

                          Si tu as un problème avec l'insertion de variables dans une requête SQL, autant utiliser ?, qui te protège contre les injections SQL!

                          cursor.execute("SELECT Id FROM Player WHERE name=?", (name, ))
                          • Partager sur Facebook
                          • Partager sur Twitter
                            12 décembre 2010 à 19:36:38

                            La syntaxe n'est pas

                            Citation : FMIS@Menace.

                            cursor.execute("SELECT Id FROM Player WHERE name=?", (name, ))



                            (qui ne fonctionne pas), mais :

                            cursor.execute("SELECT Id FROM Player WHERE name=%s", (name, ))
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              17 décembre 2010 à 21:10:12

                              Rebonjour et désolé de ne répondre que maintenant...

                              Donc, je ne veux pas faire l'imbécile (ben oui le site du Zéro ^^) mais je n'ai pas compris grand chose, pourrais-tu m'expliquer avec des exemples un peu plus précis:

                              Alors mon script pour la partie SQL c'est ça :

                              # -*- coding: cp1252 -*-
                              
                              import MySQLdb
                              
                              syno3="Résumé :Que se passe-t-il quand Dieu perd foi en l'humanité et envoie une légion d'anges pour exterminer la race humaine ? Un groupe de résistance se constitue en plein désert autour de l'archange Michael..."
                              
                              conn = MySQLdb.connect (host = "localhost",
                                                     user = "userx",
                                                     passwd = "",
                                                     db = "dbx")
                              cursor = conn.cursor ()
                              cursor.execute ("""
                                  INSERT INTO dle_post (short_story)
                                  VALUES
                                   (%s)
                               """ % (syno3))
                              


                              Et mon erreur :

                              Traceback (most recent call last):
                                File "D:/anasbud/Bureau/test sql.py", line 20, in <module>
                                  """ % (syno3))
                                File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 174, in execute
                                  self.errorhandler(self, exc, value)
                                File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
                                  raise errorclass, errorvalue
                              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 ':Que se passe-t-il quand Dieu perd foi en l'humanit\xe9 et envoie une l\xe9gion d'ange' at line 3")


                              Merci
                              • Partager sur Facebook
                              • Partager sur Twitter
                                17 décembre 2010 à 22:50:36

                                Il faut que tu utilises le code suivant. Tu mets des %s dans ta chaîne, et tu passes en argument les variables. Ensuite le module fera ce qu'il faut (mettre des guillemets, échapper les guillemets, etc...).

                                # -*- coding: cp1252 -*-
                                
                                import MySQLdb
                                
                                syno3="Résumé :Que se passe-t-il quand Dieu perd foi en l'humanité et envoie une légion d'anges pour exterminer la race humaine ? Un groupe de résistance se constitue en plein désert autour de l'archange Michael..."
                                
                                conn = MySQLdb.connect (host = "localhost",
                                                       user = "userx",
                                                       passwd = "",
                                                       db = "dbx")
                                cursor = conn.cursor ()
                                cursor.execute ("""
                                    INSERT INTO dle_post (short_story)
                                    VALUES
                                     (%s)
                                 """, syno3)  # et là on passe l'argument en paramètre.
                                
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  17 décembre 2010 à 23:26:00

                                  Citation : Lord Casque Noir

                                  Tu n'as pas lu la doc...



                                  Je t'assure que j'ai essayer, mais l'anglais et moi, ça fait 2.


                                  Pour ce qui est du script, ça passe enfin, mais vu que j'ai plus de 3 arguments, l'erreur s'affiche me disant que c'est 3 arg. maximum

                                  TypeError: execute() takes at most 3 arguments (8 given)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    17 décembre 2010 à 23:36:04

                                    Bah essaye de passer un tuple en argument, ça devrait passer je pense.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      27 décembre 2010 à 19:31:24

                                      Super le tuple ([])


                                      Ca marche enfin ^^


                                      Merci beaucoup à tous
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        27 décembre 2010 à 21:57:09

                                        Euh oui... sauf qu'un tuple ça se définit par des parenthèses... :-°

                                        Je te conseille vivement de relire le cours sur Python.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Anonyme
                                          27 décembre 2010 à 22:50:12

                                          HAHAHA Du moment que ça marche ^^'
                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Ajout de données dans une base MySQL

                                          × 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