Escape string Python для MySQL

Я использую Python и MySQLdb для загрузки веб-страниц и их хранения в базе данных. Проблема в том, что я не могу сохранить сложные строки в базе данных, потому что они не были экранированы.

Есть ли функция в Python, которую я могу использовать, чтобы избежать строки для MySQL? Я пробовал с ''' (тройные простые кавычки) и """, но это не сработало. Я знаю, что PHP имеет mysql_escape_string(), что-то похожее в Python?

Спасибо.

Ответ 2

Библиотека MySQLdb на самом деле сделает это для вас, если вы используете их реализации для построения строки запроса SQL вместо того, чтобы пытаться создать свой собственный.

Не выполнять:

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

делать:

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

Ответ 3

>>> 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'

Ответ 4

Используйте текстовую функцию sqlalchemy для удаления интерпретации специальных символов:

Обратите внимание на использование функции text("your_insert_statement") ниже. То, что он делает, сообщает sqlalchemy, что все вопросительные знаки и знаки процента в переданной строке должны рассматриваться как литералы.

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