2017-06-22 1 views
0

Avec un script dans Python3, après l'extraction des chaînes d'un fichier, ils doivent être utilisés en tant que données à insérer dans une base de données MySQL comme suit:requête Python et MySQL avec des guillemets

query1 = """INSERT INTO {:s} VALUES ({:s}, {:s}, {:s}, {:s});""".format(table1,"""0""",string1,string2,string3) 
cursor1.execute(query1) 

Certaines des chaînes contiennent différentes et des citations désagréables, comme:

a "'double quoted'" example string 

Si je définis quelques exemples de chaînes triples guillemets délimiteurs

string1 = """a "'double quoted'" example string""" 

la requête ci-dessus est réussie. Si les chaînes sont plutôt renvoyées par une fonction après l'analyse d'un fichier externe, la requête génère une erreur:

_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 \'first string, "\'Quoted part\'" of second string, , Third string\' at line 1') 

J'ai essayé aussi avec:

query1 = """INSERT INTO {:s} VALUES ('{:s}', '{:s}', '{:s}', '{:s}');""".format(table1,"""0""",string1,string2,string3) 

mais la même erreur est générée.

également

query1 = """INSERT INTO %s VALUES (%s, %s, %s, %s);""" 
data1 = ("""table1"""","""0""",string1,string2,string3) 
cursor1.execute(query1,data1) 

et

query1 = """INSERT INTO %s VALUES ('%s', '%s', '%s', '%s');""" 
data1 = ("""table1"""","""0""",string1,string2,string3) 
cursor1.execute(query1,data1) 

génèrent la même erreur.

Comment résoudre ce problème? Peut-être, une fois que les fonctions ont été renvoyées par la fonction, est-il possible de les redéfinir avec des guillemets?

+1

passer les valeurs en tant que paramètres [ 'curseur .execute'] (https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html) au lieu de les mettre en forme dans votre chaîne. – khelwood

+0

@khelwood J'ai édité la question avec une autre tentative, si c'est ce que vous disiez. Si ce n'est pas le cas, pouvez-vous s'il vous plaît faire un exemple simple? – BowPark

+0

http://pymysql.readthedocs.io/en/latest/user/examples.html – Kendas

Répondre

1

Voici comment ajouter des paramètres à une instruction.

sql = "INSERT INTO my_table VALUES (%s, %s, %s);" 

cursor.execute(sql, [string1, string2, string3]) 

Voir MySQLCursor.execute().

Dans cet exemple, vous n'avez pas besoin de citer explicitement les valeurs, car vous ne les collez pas dans votre SQL. De plus, ceci est plus sûr, car si la chaîne contient une citation finale et un code SQL malveillant, elle ne sera pas exécutée.

Vous ne pouvez pas ajouter le nom de la table comme paramètre, donc si cela dans une variable que vous aurait avoir à coller que dans votre SQL:

sql = "INSERT INTO {} VALUES (%s, %s, %s);".format(table_name)