带多变量的sqlite3 python查询错误

带多变量的sqlite3 python查询错误,python,sqlite,Python,Sqlite,我到处寻找我问题的答案,却找不到好答案。。。。我正在使用python和sqlite3模块来查询数据库。问题是,我无法获得一个包含多个变量的sql查询。例如 我可以让这个查询完美地工作。(“wordsofar”是变量名) 但是,我无法使此代码正常工作。(“wordsofar”和“noletter”是变量名) 它给了我一个错误:“绑定参数0时出错” 我试图重写查询,因此它使用了命名约定,而不是“?”,如(在页面的一半处)所示,但这并没有解决问题 任何帮助都将不胜感激。谢谢大家! 您的代码看起来不错

我到处寻找我问题的答案,却找不到好答案。。。。我正在使用python和sqlite3模块来查询数据库。问题是,我无法获得一个包含多个变量的sql查询。例如

我可以让这个查询完美地工作。(“wordsofar”是变量名)

但是,我无法使此代码正常工作。(“wordsofar”和“noletter”是变量名)

它给了我一个错误:“绑定参数0时出错”

我试图重写查询,因此它使用了命名约定,而不是“?”,如(在页面的一半处)所示,但这并没有解决问题

任何帮助都将不胜感激。谢谢大家!

您的代码看起来不错

问题在于数据。wordsofar或noletter都是sqlite3不知道如何存储的对象

一种解决方案是对对象进行酸洗。另一个解决方案是提供转换器和适配器功能

用于注册可调用的,以将自定义Python类型转换为SQLite支持的类型之一

这些文件还描述了如何提供转换器来处理反向转换:

SQLite本机仅支持TEXT、INTEGER、FLOAT、BLOB和 无效的如果要使用其他类型,则必须添加对它们的支持 你自己detect_types参数和使用自定义转换器 已向模块级函数allow注册 你可以很容易地做到这一点

这是一个相关的。

这一行(你说行得通)表明,
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
是一个元组(正如您在评论中所说的)


假设第二个参数始终是
参数
。如果使用“?”,则参数的数量(
len(parameters)
)等于sql语句中“?”的数量。

“wordsofar”当前是一个元组。第一个sql查询很好地接受了这一点。这就是为什么我认为这是代码的问题,而不是数据类型的问题。目前,我在查询上方有这一行,用于将其转换为元组“wordsofar=(wordsofar,)”。如果没有这一行,并将变量保留为字符串数据,则会出现错误,即提供的参数太多。我如何使用register\u adapter或register\u converter()选项来解决这个问题?我只是在学习python,在docs.python.org网站上我不知道该怎么做。谢谢你的帮助!你能展示一下这两个变量的内容并解释一下你想用它们来完成什么吗?在第一个实例中,WordsFar中的第一个值被绑定到单个“?”。在第二个查询中,您要求将整个元组绑定到第一个“?”。从结果来看,在第一个查询中,整个元组绑定到了“?”。变量中有sql通配符,使wordsofar看起来像
\uuu a\uuu
,noletter看起来像
%b%
问题得到解决,通过使查询看起来像@J.F.Sebastian建议的那样,它可以正常工作。是元组导致了问题。将
wordsFar
替换为
wordsFar[0]
以提取底层字符串。实际上,这两个变量都是元组。但是对第二个查询的修复非常有效!谢谢
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,))