带有SQL通配符等的Python字符串格式

带有SQL通配符等的Python字符串格式,python,sql,format,sql-like,Python,Sql,Format,Sql Like,我很难让python中的一些sql正确地通过MySQLdb。是pythons的字符串格式让我很难受 我的sql语句使用带有通配符的LIKE关键字。我在Python中尝试了许多不同的东西。问题是,一旦我让其中一个正常工作,MySQLdb中就会有一行代码在字符串格式上打嗝 尝试1: 从用户内部联接中选择tag.userId、countuser.id作为totalRows 在user.id上标记=tag.userId,其中user.username类似于“%%s%”查询 这是不可能的。我得到值错误:

我很难让python中的一些sql正确地通过MySQLdb。是pythons的字符串格式让我很难受

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

尝试1:

从用户内部联接中选择tag.userId、countuser.id作为totalRows 在user.id上标记=tag.userId,其中user.username类似于“%%s%”查询

这是不可能的。我得到值错误:

ValueError:索引128处不支持格式字符“0x27”

尝试2:

从用户内部联接中选择tag.userId、countuser.id作为totalRows tag ON user.id=tag.userId,其中user.username类似“\%%s\%” 质疑

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

尝试3:

like=like“%+strquery+%”totalq=SELECT tag.userId, countuser.id为user.id上用户内部联接标记中的totalRows= tag.userId,其中user.username+like

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

文件build/bdist.macosx-10.6-universal/egg/MySQLdb/cursors.py,第行 158,在执行查询中=查询%db.literalargs类型错误:不够 格式字符串的参数

尝试4:

like=like'\%+strquery+\%'totalq=SELECT tag.userId, countuser.id为user.id上用户内部联接标记中的totalRows= tag.userId,其中user.username+like

这与尝试3的输出相同


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

要在python字符串格式表达式中转义符号AND,请将符号AND加倍:

'%%%s%%' % search_string

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

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

其中有两个参数被传递给执行。

这与字符串格式无关,但问题是如何根据Python中的db操作要求执行查询

试着这样做:

sql = "SELECT column FROM table WHERE col1=%s AND col2=%s" 
params = (col1_value, col2_value)
cursor.execute(sql, params)
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)

如果您有一些对mysql同样有效的解释,mysqldb也遵循PEP249 dba api指南2.0:

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

您不能使用:

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

我们可以尝试通过如下方式将百分比加倍来转义百分比字符:

sql = "SELECT column FROM table WHERE col1=%s AND col2=%s" 
params = (col1_value, col2_value)
cursor.execute(sql, params)
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)

所以我尝试了这个方法,我想我得到了一个更简单的答案,对我这个学生来说。 在我的代码中,表名是books,搜索的列是name。 如果你需要更多的解释,那么请随意在dhruv2003上发邮件。joshi@gmail.com我会尽我所能尽快回答

def S():

        n=str(input('Enter the name of the book: '))

        name='%'+n+'%'

        NAME=name

        query="select * from books where Name like '"+NAME+"' "

        c.execute(query)

        ans=c.fetchall()
        
        if len(ans)>0:
            print('')

            for i in ans:

                print(i)

             print('')

        else:
            print('')

            print('An error occured')

            print('Name you gave does not exist :( ')

            print('')

这看起来也容易受到SQL注入的攻击。通过任何用于连接数据库的库使用参数化查询是一种方法。@jrdioko:谢谢您的评论。请注意,没有实际的字符串插值,查询是由execute方法准备的。我收回这一点,似乎语法就是所讨论的库执行参数化查询的方式。谢谢。成功了。出于某种原因,我认为MySQL db甚至可以在sql语句内部找到如何转义参数的方法。但是现在像这样输入参数是有意义的。很高兴它帮助了您!我花了很多时间,直到不久前我明白了这一点:这对于SQL中的通配符和类似语句是如何工作的。我在这里也问了同样的问题。我想在cursor.execute中发送参数,其中%s将用作通配符和LIKE语句。要在下面回显@bernie:From psycopg docs::Never,Never,Never,Never使用Python字符串连接+或字符串参数插值%将变量传递给SQL查询字符串。甚至在枪口下也没有。除了SQL注入攻击之外,驱动程序还可以自动将Python对象与SQL文本进行转换:使用此功能,您的代码将更加健壮和可靠。这与合成查询字符串的幼稚方法相比,例如使用字符串连接。这并不比直接替换好多少,你无论如何都不应该这样做。上述占位符和PEP 249文档中的占位符描述了如何正确执行此操作,如何使用占位符并将搜索字符串作为参数发送到cursor.execute函数。因此,这将阻止我进行任何类型的SQL注入。如果您能稍微描述一下您的代码以及它是如何解决问题的,那会更好。