我有一个很难得到一些SQL在Python正确经历MySQLdb的。 这是杀害我蟒蛇字符串格式化。
我的sql语句使用通配符与LIKE关键字。 我已经尝试了一些在Python不同的事情。 问题是,一旦我得到他们的一个工作,还有的代码MySQLdb的一条线,在字符串格式打嗝。
尝试1:
“SELECT tag.userId,计数(user.id)作为totalRows FROM用户INNER JOIN标签ON user.id = tag.userId WHERE user.username LIKE '%% S%'” %(查询)
这是一个没有去。 我得到的值错误:
ValueError异常:不支持的格式的字符“””(0×27)中的索引128
尝试2:
“SELECT tag.userId,计数(user.id)作为totalRows FROM用户INNER JOIN标签ON user.id = tag.userId WHERE user.username LIKE '\ %%小号\%'” %(查询)
我从尝试1相同的结果。
尝试3:
像= “LIKE '%” + STR(查询)+ “%'” totalq =“SELECT tag.userId,计数(user.id)作为totalRows FROM用户INNER JOIN标签ON user.id = tag.userId WHERE user.username “像+
这正确地创建totalq变量,但现在当我去运行查询我从MySQLdb的得到错误:
文件 “建立/ bdist.macosx-10.6通用/蛋/ MySQLdb的/ cursors.py”,线路158,在执行查询=查询%db.literal(参数)类型错误:没有足够的论据格式字符串
尝试4:
像= “LIKE '\%” + STR(查询)+ “\%'” totalq =“SELECT tag.userId,计数(user.id)作为totalRows FROM用户INNER JOIN标签ON user.id = tag.userId WHERE用户.username“+像
这是尝试3的输出相同。
这一切似乎很奇怪的。 如何使用与蟒蛇SQL语句通配符?
这不是字符串格式化,但问题是如何查询应根据在Python(DB操作要求来执行的PEP 249 )
尝试是这样的:
sql = "SELECT column FROM table WHERE col1=%s AND col2=%s"
params = (col1_value, col2_value)
cursor.execute(sql, params)
这里有psycog2一些例子 ,你有一些解释也应该是有效的MySQL(MySQLdb的也遵循PEP249 DBA API指导2.0: 这里有MySQLdb的例子 )
这些查询似乎都容易受到SQL注入式攻击。
尝试这样的事情,而不是:
curs.execute("""SELECT tag.userId, count(user.id) as totalRows
FROM user
INNER JOIN tag ON user.id = tag.userId
WHERE user.username LIKE %s""", ('%' + query + '%',))
凡有传递两个参数execute()
为了摆脱在Python的字符串格式化表达式&符号,双符号:
'%%%s%%' % search_string
编辑:但我绝对有另一个答案一致。 在SQL查询直接字符串替换几乎总是一个坏主意。
我们可以尝试通过他们这样加倍转义字符百分比:
query_to_get_user_name = """
SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag
ON user.id = tag.userId
WHERE user.username LIKE '%%%s%%' """ % (user_name,)
cursor.execute(query_to_get_user_name)
我有一个解决问题的方法:
您不能使用:
"SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username LIKE '%%s%'" % (query)
你可以用字符串模板,如更改:
import MySQLdb
import string # string module
.......
value = {'user':'your value'}
sql_template = string.Template("""
SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN
tag ON user.id = tag.userId WHERE user.username LIKE '%$user%'
""")
sql = sql_template.substitute(value)
try:
cursor.execute(sql)
...........
except:
...........
finally :
db.close()