与SQL通配符和LIKE Python字符串格式与SQL通配符和LIKE Python字符串格式(P

2019-05-12 04:35发布

我有一个很难得到一些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语句通配符?

Answer 1:

这不是字符串格式化,但问题是如何查询应根据在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的例子 )



Answer 2:

这些查询似乎都容易受到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()



Answer 3:

为了摆脱在Python的字符串格式化表达式&符号,双符号:

'%%%s%%' % search_string

编辑:但我绝对有另一个答案一致。 在SQL查询直接字符串替换几乎总是一个坏主意。



Answer 4:

我们可以尝试通过他们这样加倍转义字符百分比:

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)


Answer 5:

我有一个解决问题的方法:

您不能使用:

"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()


文章来源: Python String Formats with SQL Wildcards and LIKE