ti-enxame.com

Escapar string Python para MySQL

Eu uso Python e MySQLdb para baixar páginas da Web e armazená-las no banco de dados. O problema que tenho é que não consigo salvar seqüências complicadas no banco de dados porque elas não são escapadas adequadamente.

Existe uma função em Python que eu possa usar para escapar de uma string para o MySQL? Eu tentei com ''' (aspas simples triplas) e """, mas não funcionou. Eu sei que PHP tem mysql_escape_string(), é algo semelhante em Python?

Obrigado.

62
Laurențiu Dascălu
conn.escape_string()

Consulte Mapeamento de funções da API C do MySQL: http://mysql-python.sourceforge.net/MySQLdb.html

83
miku

A biblioteca MySQLdb realmente fará isso por você, se você usar as implementações para criar uma string de consulta SQL em vez de tentar criar a sua própria.

Não faça:

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

Faz:

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

se a função de texto do sqlalchemy para remover a interpretação de caracteres especiais:

Observe o uso da função text("your_insert_statement") abaixo. O que ele faz é comunicar ao sqlalchemy que todos os pontos de interrogação e sinais de porcentagem na string passada na string devem ser considerados literais.

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

engine = sqlalchemy.create_engine("mysql+mysqlconnector://%s:%[email protected]%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