Ответ 1
conn.escape_string()
См. сопоставление функций API MySQL C: http://mysql-python.sourceforge.net/MySQLdb.html
Я использую Python и MySQLdb для загрузки веб-страниц и их хранения в базе данных. Проблема в том, что я не могу сохранить сложные строки в базе данных, потому что они не были экранированы.
Есть ли функция в Python, которую я могу использовать, чтобы избежать строки для MySQL? Я пробовал с '''
(тройные простые кавычки) и """
, но это не сработало. Я знаю, что PHP имеет mysql_escape_string()
, что-то похожее в Python?
Спасибо.
conn.escape_string()
См. сопоставление функций API MySQL C: http://mysql-python.sourceforge.net/MySQLdb.html
Библиотека 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))
>>> 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'
Используйте текстовую функцию 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()