3
#!/usr/bin/python
import sqlite3

conn = sqlite3.connect("/home/michael/Dropbox/lagniappe/database.db")

cursor = conn.cursor()

query = raw_input('Search for a title:')

cursor.execute("SELECT * FROM nerd WHERE title LIKE '%?%';", query)

print cursor.fetchall()

返回错误:

michael@piplup:~$ python sqlite.py 
Search for a title:test
Traceback (most recent call last):
  File "sqlite.py", line 10, in <module>
    cursor.execute("SELECT * FROM nerd WHERE title LIKE '%?%';", query)
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 0, and there are 4 supplied.

我想要它做的就是将它从数据库接收到的数据打印到控制台。最终我想操作这些数据,但我只需要查询正常工作。

4

3 回答 3

2

这里有两个问题。首先,参数应该是一个序列——Python 将它解释为一个由四个字符组成的列表,而不是一个四个字符的字符串。

其次,占位符必须是整个元素,而不是引号。您需要自己添加百分比字符:

query = raw_input('Search for a title:')
query = '%' + query + '%'
cursor.execute("SELECT * FROM nerd WHERE title LIKE ?", (query,))
于 2013-02-13T00:08:35.650 回答
0

您需要将元组传递给cursor.execute. 尝试(query,)代替query.

cursor.execute("SELECT * FROM nerd WHERE title LIKE '%?%';", (query,))
于 2013-02-13T00:05:21.493 回答
0

首先,该execute方法的第二个参数应该是一个序列,并且您正在传递一个字符串(被解释为一个字符序列),这就是它说的原因... and there are 4 supplied.

其次,比较参数周围的引号会LIKE阻止执行方法将其解释?为占位符;相反,它被解释为文字?

因此,要使您的查询正常工作,您必须做两件事:

  1. 添加%到您的query参数中,将它们嵌入到 SQL 查询中。
  2. query在序列(单元素元组或列表)中传递参数。

您的脚本如下所示:

#!/usr/bin/python
import sqlite3
conn = sqlite3.connect("/home/michael/Dropbox/lagniappe/database.db")
cursor = conn.cursor()
query = '%%%s%%' % raw_input('Search for a title:') # puts the input between %
cursor.execute("SELECT * FROM nerd WHERE title LIKE ?;", (query,)) # passes the query as a tuple
print cursor.fetchall()
于 2013-02-13T00:08:53.270 回答