我使用Python和MySQLdb下载网页并将其存储到数据库中。我的问题是我无法将复杂的字符串保存在数据库中,因为它们没有正确地转义。
Python中是否有一个我可以用来为MySQL转义字符串的函数?我尝试使用'''
(三重简单引号)和"""
,但没有用。我知道PHP具有mysql_escape_string()
,在Python中是否类似?
谢谢。
我使用Python和MySQLdb下载网页并将其存储到数据库中。我的问题是我无法将复杂的字符串保存在数据库中,因为它们没有正确地转义。
Python中是否有一个我可以用来为MySQL转义字符串的函数?我尝试使用'''
(三重简单引号)和"""
,但没有用。我知道PHP具有mysql_escape_string()
,在Python中是否类似?
谢谢。
%
代码中的最后一个标记不应该是,
逗号吗,否则就一样吗?@zelusp
% (data, condition)
走的是变量data
和condition
并把它到两个%s
占位符。
condition
例如,如果使用,则" or 1 == 1 or"
可能会出现问题。cur.execute
通过做提供转义cur.execute('SOME COMMAND ?', [value])
。?
被价值所取代。
Answers:
conn.escape_string()
请参见MySQL C API函数映射:http : //mysql-python.sourceforge.net/MySQLdb.html
如果您使用MySQLdb库的实现来构建SQL查询字符串而不是尝试构建自己的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))
db.literal
作为escape
呢,所以称其为“更安全”是一个有点用词不当。使用它是因为它对于小型查询更容易,但是当您不得不手工制作大型查询或脚本时,不必担心会丢失某些内容。
>>> 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函数删除特殊字符的解释:
请注意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()
安装sqlescapy软件包:
pip install sqlescapy
那么您可以在原始查询中转义变量
from sqlescapy import sqlescape
query = """
SELECT * FROM "bar_table" WHERE id='%s'
""" % sqlescape(user_input)
解决此问题的另一种方法是在python中使用mysqlclient时使用类似的方法。
假设您要输入的数据是这样的<ol><li><strong style="background-color: rgb(255, 255, 0);">Saurav\'s List</strong></li></ol>
。它包含双qoute和单引号。
您可以使用以下方法对引号进行转义:
statement =“”“更新聊天集html ='{}'”“” .format(html_string.replace(“'”,“ \\\'”))
注意:需要三个\字符以转义无格式python字符串中的单引号。
{!a}
适用ascii()
,因此转义了非ASCII字符,例如引号,甚至表情符号。这是一个例子
cursor.execute("UPDATE skcript set author='{!a}',Count='{:d}' where url='{!s}'".format(authors),leng,url))
db_cur.execute('''UPDATE test_table SET field_1="%s" WHERE field_2="%s"''' % (data, condition))
注意三联单引号和双引号%s