我很难在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语句中的通配符?
答案 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()