Python:当我在 SQL 代码中使用循环元素时出现问题。错误:sqlite3。InterfaceError:绑定参数 0 时出错 - 可能不支持的类型

Python: problem when i use elements of a loop inside a SQL code. Error: sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type

提问人:Horiatiki 提问时间:10/2/2023 最后编辑:Horiatiki 更新时间:10/2/2023 访问量:74

问:

我想在 Sql 代码中使用。我使用一个循环单独提取 并在 SQL 代码中单独使用它们。但是我有这个错误:every_letterletters

sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.

我指定必须保持这样,括号中没有变化。 实际上是上一个 cur.execute 的结果。我用字母 = cursor_test.fetchall() 后面的字母得到它letters = [('a',), ('b',), ('c',), ('d',)]lettersscrape

正如你所猜到的,我想在sql代码中单独使用每个字母。所以一旦 sql 代码 for , once sql 代码 for , once sql code for , etc etc: 自动,无需手动指定字母abc

我做错了什么?

conn = sqlite3.connect('...')
cur = conn.cursor()

letters =  [('a',), ('b',), ('c',), ('d',)]

for every_letter in letters:
    print("every_letter: ", every_letter)

    cur.execute('''SELECT name, example1, example2
               FROM TableExample
               WHERE name = ?''', [every_letter])
python-3.x 循环 sqlite for-loop

评论

0赞 John Gordon 10/2/2023
letters = [('a',), ('b',), ('c',), ('d',)]您是否知道这会生成一个单元素元组列表?这真的是你想要的吗?
0赞 Horiatiki 10/2/2023
@JohnGordon 是的。字母实际上是先前 cur.execute 的结果。我在刮擦后用字母 = cursor_test.fetchall() 得到它
0赞 John Gordon 10/2/2023
发生此错误的原因是 sqlite 不能在子句中使用元组值。这是有道理的,因为它应该是一个单一的东西(一个字符串,或一个整数等)。在该上下文中使用值的元组是没有意义的。WHERE column = valuevalue
0赞 Horiatiki 10/2/2023
@JohnGordon我知道使用值的元组没有意义。如前所述,这是抓取的结果,我几乎无法修改它。我正在寻找一种方法来单独从元组中提取每个值并将其传递到 sql 代码中。有可能?
0赞 John Gordon 10/2/2023
我认为如果您只是作为查询参数传递,而不使用方括号,它将起作用。every_letter

答:

1赞 HernanATN 10/2/2023 #1

您的代码尝试执行的操作是将 a 传递给查询。 类型 您得到的错误意味着,准确地说,可能不受支持。tupleletterslist[tuple[str]]tuple[str]

你是在尝试传递元组吗?或者您只想以“('a',)”的形式传递字符串文字

在后一种情况下,应将列表中的每个元素用字符串引号括起来。

letters = ["('a',)", "('b',)", "('c',)", "('d',)"]

这样,当您遍历 中的每个元素时,您正在遍历该方法可以处理的字符串列表。lettersexecute

另一方面,如果你需要访问这些元组中的基础元素,你可以使用推导式

letters = [('a',), ('b',), ('c',), ('d',)]
letters_unpacked = [l for l, in letters]

并遍历解压缩的列表。

请注意,如果为您提供列表而不是对其进行硬编码,则可以将这两个语句组合在一起。

letters = [tup for tup, in someFunction()]

for every_letter in letters:
    print("every_letter: ", every_letter)

    cur.execute('''SELECT name, example1, example2
               FROM TableExample
               WHERE name = ?''', every_letter)

如果元组包含多个元素,则可以在两个嵌套推导式中进一步解压缩元组

letters = [element for element in [tup for tup, in someFunction()]]

for every_letter in letters:
    print("every_letter: ", every_letter)

    cur.execute('''SELECT name, example1, example2
               FROM TableExample
               WHERE name = ?''', every_letter)

Screencapture of last snippet and output showing correct result

评论

0赞 Horiatiki 10/2/2023
你的解决方案不好。字母只是这个问题的一个例子。实际上,字母是用许多元素刮擦的结果。我不能手动在所有这些上加上引号。你还有其他想法吗?
0赞 Horiatiki 10/2/2023
我发现你的第二个解决方案更有用。在sql代码中,我应该写这个吗?其中名称 = ?''', [letters_unpacked])。你能给我看一下完整的代码吗?(包括循环)。谢谢
0赞 Horiatiki 10/2/2023
我看到你编辑了你的答案,但也许你没有阅读我的评论。你能告诉我你的第二个解决方案的完整代码吗?谢谢
0赞 HernanATN 10/2/2023
正如我所写的,您仍然应该遍历新列表。因此,循环和 SQL 位应保持不变。
0赞 HernanATN 10/2/2023
我已经编辑了答案,以解决 s 包含多个元素的情况。我已经按照要求添加了循环。tuple