Escape-строка Python для MySQL - PullRequest
62 голосов
/ 01 сентября 2010

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

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

Спасибо.

Ответы [ 5 ]

83 голосов
/ 01 сентября 2010
conn.escape_string()

См. Сопоставление функций MySQL C API: http://mysql -python.sourceforge.net / MySQLdb.html

53 голосов
/ 20 декабря 2014

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

Не делай:

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

Do:

sql = "INSERT INTO TABLE_A (COL_A,COL_B) VALUES (%s, %s)"
cursor.execute(sql, (val1, val2))
9 голосов
/ 03 августа 2017
>>> 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'
1 голос
/ 20 ноября 2014

Используйте текстовую функцию 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:%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()
0 голосов
/ 13 октября 2018

{!a} применяется ascii() и, следовательно, экранирует не-ASCII символы, такие как кавычки и даже смайлики. Вот пример

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

Python3 документы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...