使用SQL通配符和LIKE的Python字符串格式

gng*_*zrd 22 python sql format sql-like

我很难在python中获取一些sql以正确浏览MySQLdb.它是pythons字符串格式化,正在杀死我.

我的sql语句使用带有通配符的LIKE关键字.我在Python中尝试了很多不同的东西.问题是,一旦我让其中一个工作,MySQLdb中的一行代码就是字符串格式.

尝试1:

"SELECT tag.userId,count(user.id)as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username LIKE'%% s%'"%(query)

这是不行的.我得到价值错误:

ValueError:索引128处不支持的格式字符'''(0x27)

尝试2:

"SELECT tag.userId,count(user.id)as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username LIKE'\ %% s \%'"%(query)

我从尝试1得到了相同的结果.

尝试3:

like ="LIKE'%"+ str(查询)+"%'"totalq ="SELECT tag.userId,count(user.id)as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username "+喜欢

这正确地创建了totalq变量,但是现在当我去运行查询时,我从MySQLdb获得错误:

文件"build/bdist.macosx-10.6-universal/egg/MySQLdb/cursors.py",第158行,执行查询=查询%db.literal(args)TypeError:格式字符串的参数不够

尝试4:

like ="LIKE'\%"+ str(查询)+"\%'"totalq ="SELECT tag.userId,count(user.id)as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user .username"+喜欢

这与尝试3的输出相同.

这一切似乎都很奇怪.如何在python的sql语句中使用通配符?

ber*_*nie 26

这些查询似乎都容易受到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 + '%',))
Run Code Online (Sandbox Code Playgroud)

哪里有两个参数传递给execute().

  • @jrdioko:谢谢你的评论.请注意,没有实际的字符串插值,并且查询*是由`execute()`方法准备的. (5认同)

dzi*_*ida 11

它不是字符串格式,但问题是如何根据Python中的db操作要求执行查询(PEP 249)

尝试这样的事情:

sql = "SELECT column FROM table WHERE col1=%s AND col2=%s" 
params = (col1_value, col2_value)
cursor.execute(sql, params)
Run Code Online (Sandbox Code Playgroud)

这里有一些psycog2的例子,你有一些解释也应该对mysql有效(mysqldb也遵循PEP249 dba api指导2.0:这里是mysqldb的例子)

  • 这对 SQL 中的通配符和 LIKE 语句有何作用。我在这里问过同样的问题。我想在 cursor.execute() 中发送参数,其中 %s 将用作通配符和 LIKE 语句。 (2认同)

jrd*_*oko 10

要在Python字符串格式化表达式中转义&符号,请将&符号加倍:

'%%%s%%' % search_string
Run Code Online (Sandbox Code Playgroud)

编辑:但我绝对同意另一个答案.SQL查询中的直接字符串替换几乎总是一个坏主意.