我使用Python和MySQLdb下载网页并将其存储到数据库中。问题是我无法将复杂的字符串保存到数据库中,因为它们没有正确转义。Python中有没有一个函数可以用来转义MySQL中的字符串?我试过使用'''(三重单引号)和""",但是没有用。我知道PHP有mysql_escape_string(),Python中有类似的东西吗?
'''
"""
mysql_escape_string()
ymzxtsji1#
conn.escape_string()
请参阅MySQL C API函数Map:http://mysql-python.sourceforge.net/MySQLdb.html
tvmytwxo2#
如果您使用MySQLdb库的实现来构建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))
snvhrwxg3#
>>> 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'
xeufq47z4#
使用sqlalchemy的text函数删除特殊字符的解释:
注意下面函数text("your_insert_statement")的用法,它的作用是通知sqlalchemy传入的字符串中的所有问号和百分号都应被视为文字。
text("your_insert_statement")
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()
xcitsw885#
另一个解决这个问题的方法是在python中使用mysqlclient时使用类似的方法。假设您要输入的数据类似于<ol><li><strong style="background-color: rgb(255, 255, 0);">Saurav\'s List</strong></li></ol>。它同时包含双引号和单引号。您可以使用下列方法来逸出引号:更新聊天设置注意:需要三个\字符来转义无格式python字符串中的单引号。
<ol><li><strong style="background-color: rgb(255, 255, 0);">Saurav\'s List</strong></li></ol>
j0pj023g6#
安装sqlescapy包:
pip install sqlescapy
那么您可以转义原始查询中的变量
from sqlescapy import sqlescape query = """ SELECT * FROM "bar_table" WHERE id='%s' """ % sqlescape(user_input)
5n0oy7gb7#
{!a}应用ascii(),因此转义非ASCII字符,如引号,甚至图释。
{!a}
ascii()
cursor.execute("UPDATE skcript set author='{!a}',Count='{:d}' where url='{!s}'".format(authors),leng,url))
Python 3文档
7条答案
按热度按时间ymzxtsji1#
请参阅MySQL C API函数Map:http://mysql-python.sourceforge.net/MySQLdb.html
tvmytwxo2#
如果您使用MySQLdb库的实现来构建SQL查询字符串,而不是尝试构建自己的查询字符串,那么MySQLdb库实际上会为您完成这一任务。
不做:
应执行:
snvhrwxg3#
xeufq47z4#
使用sqlalchemy的text函数删除特殊字符的解释:
注意下面函数
text("your_insert_statement")
的用法,它的作用是通知sqlalchemy传入的字符串中的所有问号和百分号都应被视为文字。xcitsw885#
另一个解决这个问题的方法是在python中使用mysqlclient时使用类似的方法。
假设您要输入的数据类似于
<ol><li><strong style="background-color: rgb(255, 255, 0);">Saurav\'s List</strong></li></ol>
。它同时包含双引号和单引号。您可以使用下列方法来逸出引号:
更新聊天设置
注意:需要三个\字符来转义无格式python字符串中的单引号。
j0pj023g6#
安装sqlescapy包:
那么您可以转义原始查询中的变量
5n0oy7gb7#
{!a}
应用ascii()
,因此转义非ASCII字符,如引号,甚至图释。Python 3文档