PythonとMySQLdbを使用してWebページをダウンロードし、データベースに保存します。問題は、適切にエスケープされていないため、データベースに複雑な文字列を保存できないことです。
PythonにMySQLの文字列をエスケープするために使用できる関数がありますか?_'''
_(三重の単純な引用符)と_"""
_で試しましたが、それはしませんでした '私はPHPがmysql_escape_string()
を持っていることを知っていますが、Pythonでも似ていますか?
ありがとう。
conn.escape_string()
MySQL C API関数のマッピングを参照してください: http://mysql-python.sourceforge.net/MySQLdb.html
独自に構築するのではなく、実装を使用してSQLクエリ文字列を構築する場合、MySQLdbライブラリは実際にこれを行います。
しないでください:
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:%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()