Cadena de escape Python para MySQL

Utilizo Python y MySQLdb para descargar páginas web y almacenarlas en la base de datos. El problema que tengo es que no puedo guardar cadenas complicadas en la base de datos porque no se escapan correctamente.

¿Hay alguna función en Python que pueda usar para escapar de una cadena para MySQL? Lo intenté con ''' (citas simples triples) y """ , pero no funcionó. Sé que PHP tiene mysql_escape_string() , ¿es algo similar en Python?

Gracias.

 conn.escape_string() 

Consulte la asignación de funciones de la API de MySQL C: http://mysql-python.sourceforge.net/MySQLdb.html

La biblioteca MySQLdb realmente lo hará por usted, si usa sus implementaciones para crear una cadena de consulta SQL en lugar de intentar crear la suya propia.

No hagas

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

Hacer:

 sql = "INSERT INTO TABLE_A (COL_A,COL_B) VALUES (%s, %s)" cursor.execute(sql, (val1, val2)) 
 >>> 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' 

Use la función de texto de sqlalchemy para eliminar la interpretación de caracteres especiales:

Tenga en cuenta el uso del text("your_insert_statement") de la función text("your_insert_statement") continuación. Lo que hace es comunicar a sqlalchemy que todas las preguntas y signos de porcentaje en la cadena pasada deben considerarse literales.

 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() 

{!a} aplica ascii() y, por lo tanto, escapa de los caracteres no ASCII como citas e incluso emoticons. Aquí hay un ejemplo

 cursor.execute("UPDATE skcript set author='{!a}',Count='{:d}' where url='{!s}'".format(authors),leng,url)) 

Documentos de Python3