退出MySQL的Pythonstring
我使用Python和MySQLdb来下载网页并将它们存储到数据库中。 我遇到的问题是我无法在数据库中保存复杂的string,因为它们没有正确转义。
有没有在Python中的函数,我可以用来逃避MySQL的string? 我尝试了'''
(三简单引号)和"""
,但它不工作。我知道PHP有mysql_escape_string()
,在Python中是类似的吗?
谢谢。
conn.escape_string()
请参阅MySQL C API函数映射: http : //mysql-python.sourceforge.net/MySQLdb.html
如果你使用他们的实现来构build一个SQL查询string,而不是试图构build你自己的,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))
使用sqlalchemy的文本函数删除特殊字符的解释:
请注意下面的函数text("your_insert_statement")
。 它所做的是与sqlalchemy交stream,传入的string中的所有问号和百分号应被视为文字。
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()
>>> 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'