web-dev-qa-db-fra.com

Chaîne d'échappement Python pour MySQL

J'utilise Python et MySQLdb pour télécharger des pages Web et les stocker dans une base de données. Le problème que j'ai est que je ne peux pas enregistrer de chaînes compliquées dans la base de données car elles ne sont pas correctement échappées.

Existe-t-il une fonction dans Python que je puisse utiliser pour échapper à une chaîne pour MySQL? J'ai essayé avec ''' (Triples guillemets simples) et """, Mais Je ne sais pas que PHP a mysql_escape_string()], quelque chose de similaire en Python?

Merci.

62
conn.escape_string()

Voir Mappage des fonctions de l'API MySQL C: http://mysql-python.sourceforge.net/MySQLdb.html

83
miku

La bibliothèque MySQLdb le fera réellement pour vous, si vous utilisez leurs implémentations pour créer une chaîne de requête SQL au lieu d’essayer de créer la vôtre.

Ne fais pas:

sql = "INSERT INTO TABLE_A (COL_A,COL_B) VALUES (%s, %s)" % (val1, val2)
cursor.execute(sql)

Faire:

sql = "INSERT INTO TABLE_A (COL_A,COL_B) VALUES (%s, %s)"
cursor.execute(sql, (val1, val2))
53
User
>>> import MySQLdb
>>> example = r"""I don't like "special" chars ¯\_(ツ)_/¯"""
>>> example
'I don\'t like "special" chars \xc2\xaf\\_(\xe3\x83\x84)_/\xc2\xaf'
>>> MySQLdb.escape_string(example)
'I don\\\'t like \\"special\\" chars \xc2\xaf\\\\_(\xe3\x83\x84)_/\xc2\xaf'
9
Martin Thoma

tilisez la fonction text de sqlalchemy pour supprimer l'interprétation des caractères spéciaux:

Notez l'utilisation de la fonction text("your_insert_statement") ci-dessous. Ce que cela fait est de communiquer à sqlalchemy que tous les points d'interrogation et les signes de pourcentage dans la chaîne passée dans doivent être considérés comme des littéraux.

import sqlalchemy
from sqlalchemy import text
from sqlalchemy.orm import sessionmaker
from datetime import datetime
import re

engine = sqlalchemy.create_engine("mysql+mysqlconnector://%s:%s@%s/%s"
     % ("your_username", "your_password", "your_hostname_mysql_server:3306",
     "your_database"),
     pool_size=3, pool_recycle=3600)

conn = engine.connect()

myfile = open('access2.log', 'r')
lines = myfile.readlines()

penguins = []
for line in lines:
   elements = re.split('\s+', line)

   print "item: " +  elements[0]
   linedate = datetime.fromtimestamp(float(elements[0]))
   mydate = linedate.strftime("%Y-%m-%d %H:%M:%S.%f")

   penguins.append(text(
     "insert into your_table (foobar) values('%%%????')"))

for penguin in penguins:
    print penguin
    conn.execute(penguin)

conn.close()
1
Eric Leschinski