2012-07-27 102 views
12

我试图执行查询以通过Python使用MySQL搜索数据库中的3个表。每次我尝试执行以下字符串作为查询时,它都会给我一个关于字符串串联的错误。Python:ValueError:索引1处不支持的格式字符'''(0x27)

"SELECT fileid FROM files WHERE description LIKE '%" + search + "%' OR filename LIKE '%" + search + "%' OR uploader LIKE '%" + search + "%' ORDER BY fileid DESC" 

这是它给我的错误:

ValueError: unsupported format character ''' (0x27) at index 1 

如果我删除它要求则字符我也必须去除%,其中停止从实际工作正常查询。我能做些什么来解决这个问题,因为我对Python很陌生。

感谢, 克里斯

+4

为您的SQL工具使用内置的字符串替换工具,而不是尝试使用标准Python字符串机制自己构建查询字符串。它的工作方式更好。你在使用MySQLdb吗? – 2012-07-27 21:23:19

+1

是的,我正在使用MySQLdb,我在哪里可以找到这些替代工具? – user1558746 2012-07-27 21:45:32

+2

http://mysql-python.sourceforge.net/MySQLdb.html#functions-and-attributes上的文档说:“请注意,传递给execute()的查询字符串中的任何文字百分号都必须转义,即%% “。你使用'execute()'?提到的替代工具@Silas显示在http://mysql-python.sourceforge.net/MySQLdb.html#some-examples – LarsH 2014-06-30 13:41:03

回答

34

它看起来像Python是解释%为类printf格式字符。尝试使用%%?

"SELECT fileid 
FROM files 
WHERE description LIKE '%%%s%%' 
    OR filename LIKE '%%%s%%' 
    OR uploader LIKE '%%%s%%' 
    ORDER BY fileid DESC" % (search, search, search) 
+0

非常感谢,它做到了! :) – user1558746 2012-07-27 22:26:42

+3

确切地说,MySQLdb使用**%**操作符将参数放入查询中,因此查询字符串中的任何单个**%**字符都被解释为参数说明符的开始。为了防止在查询中使用_ %% _ for _%_。请参阅相应的文档:[字符串格式](http://docs.python.org/2/library/stdtypes.html#string-formatting) – Magentron 2013-10-15 13:30:23

0

你可以尝试这样的:

SELECT fileid 
FROM files 
WHERE description LIKE '%%%%%s%%%%' 
OR filename LIKE '%%%%%s%%%%' 
OR uploader LIKE '%%%%%s%%%%' 
ORDER BY fileid DESC" % (search, search, search) 
+0

你能解释为什么这回答这个问题吗? – IanS 2017-05-04 07:44:42

0

我的解决办法:

query = """SELECT id, name FROM provice WHERE name LIKE %s""" 
cursor.execute(query, '%%%s%%' % name) 

我认为这是解决此问题的简单方法!

+0

Ehm,你知道'%%% s %%'%name'部分是完全没有必要的吗?...查询的参数是'%s',它被ORM取代或者你是什么DB抽象使用... – AuHau 2017-11-03 08:43:51