带有多个变量的sqlite3 python查询错误

时间:2011-11-07 02:55:38

标签: python sqlite

我仔细查看了我的问题的答案,找不到任何好的答案....我正在使用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所示的命名约定(大约在页面的一半),但这并没有解决问题。

非常感谢任何帮助。感谢您!

2 个答案:

答案 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语句中。