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

时间:2010-06-28 17:33:01

标签: 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 \%'“%   (查询)

我从尝试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“+ like

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

  

文件“build / bdist.macosx-10.6-universal / egg / MySQLdb / cursors.py”,行   158,在执行query = query%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“+ like

这与尝试3的输出相同。

这一切看起来都很奇怪。如何在python中使用sql语句中的通配符?

7 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分: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)

here are some examples for psycog2你有一些解释也应该对mysql有效(mysqldb也遵循PEP249 dba api指导2.0:here are examples for mysqldb

答案 2 :(得分:9)

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

'%%%s%%' % search_string

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

答案 3 :(得分:0)

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

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)

答案 4 :(得分:0)

import mysql.connector
mydatabase = mysql.connector.connect(host="localhost", user="root", passwd="1234", database="databaseName")
mycursor = mydatabase.cursor()
user_input =[]
item = str("s%")
user_input.append(item)
mycursor.execute("SELECT * FROM employees WHERE FIRST_NAME LIKE %s ESCAPE ''",user_input )
result = mycursor.fetchall()
for row in enumerate(result):
    print(row)

答案 5 :(得分:0)

所以我尝试了一下,我想我得到了一个对学生来说更容易理解的答案。 在我的代码中,表名是“ books”,而我要搜索的列是“ Name”。 如果您需要更多xplaination,请随时发送邮件至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('')

答案 6 :(得分:-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)

您可以使用字符串模板更改它,例如:

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