我仔细查看了我的问题的答案,找不到任何好的答案....我正在使用python和sqlite3模块来查询数据库。问题是我无法获得一个SQL查询来保存多个变量。例如......
我可以让这个查询完美地运作。 (“wordsofar”是变量名称)
c.execute("SELECT word FROM wordlist WHERE word LIKE ?", wordsofar)
但是我无法使用此代码。 (“wordsofar”和“noletter”是变量名称)
c.execute("SELECT word FROM wordlist WHERE word LIKE ? AND word NOT LIKE ?", (wordsofar, noletter))
它给出了错误:“错误绑定参数0”
我试过重写查询而不是“?”它正在使用http://docs.python.org/py3k/library/sqlite3.html所示的命名约定(大约在页面的一半),但这并没有解决问题。
非常感谢任何帮助。感谢您!
答案 0 :(得分:1)
你的代码看起来很好。
问题在于数据。 wordsofar 或 noletter 是sqlite3不知道如何存储的对象。
一种解决方案是腌制物体。另一种解决方案是提供转换器和适配器功能。
使用register_adapter注册一个callable,将自定义Python类型转换为SQLite支持的类型之一。
文档还描述了如何提供转换器来处理反向转换:
SQLite本身仅支持TEXT,INTEGER,FLOAT,BLOB和 空值。如果要使用其他类型,则必须添加对它们的支持 你自己。 detect_types参数和使用自定义转换器 注册了模块级register_converter()函数允许 你很容易做到这一点。
这是一个相关的SO question with answers。
答案 1 :(得分:1)
这一行(你说工作)表明wordsofar
是一个元素的序列:
c.execute("SELECT word FROM wordlist WHERE word LIKE ?", wordsofar)
在这种情况下,第二行应为:
c.execute("SELECT word FROM wordlist WHERE word LIKE ? AND word NOT LIKE ?",
wordsofar + (noletter,))
如果noletter
是字符串且wordsofar
是元组(正如您在评论中所说)。
execute()
docs说第二个参数总是parameters
。如果使用'?'然后参数数量(len(parameters)
)等于'?'的数量在sql语句中。