53

我有这个查询:

some_id = 1

cursor.execute('
    SELECT "Indicator"."indicator" 
    FROM "Indicator" 
    WHERE "Indicator"."some_id" =   %s;', some_id)

我收到以下错误:

TypeError: 'int' object does not support indexing

some_id 是一个 int 但我想选择 some_id = 1 的指标(或我决定放入变量的任何 #)。

4

5 回答 5

64
cursor.execute('
    SELECT "Indicator"."indicator" 
    FROM "Indicator" 
    WHERE "Indicator"."some_id" =   %s;', [some_id])

这会将some_id参数转换为可索引的列表。假设您的方法像我认为的那样有效,这应该有效。

发生错误是因为在该方法的某处,它可能正在尝试迭代该输入,或直接对其进行索引。可能是这样的:some_id[0]

通过使它成为一个列表(或可迭代的),您允许它像这样索引到第一个元素。

你也可以通过这样做将它变成一个元组:(some_id,)它具有不可变的优点。

于 2013-08-20T22:17:06.903 回答
39

您应该将查询参数execute()作为元组(严格来说是可迭代的)传递给,(some_id,)而不是some_id

cursor.execute('
    SELECT "Indicator"."indicator" 
    FROM "Indicator" 
    WHERE "Indicator"."some_id" =   %s;', (some_id,))
于 2013-08-20T22:15:21.977 回答
11

您的 id 需要是某种可迭代的 mogrify 才能理解输入,这是常见问题文档中的相关引用:

>>> cur.execute("INSERT INTO foo VALUES (%s)", "bar")    # WRONG
>>> cur.execute("INSERT INTO foo VALUES (%s)", ("bar"))  # WRONG
>>> cur.execute("INSERT INTO foo VALUES (%s)", ("bar",)) # correct
>>> cur.execute("INSERT INTO foo VALUES (%s)", ["bar"])  # correct

这应该有效:

some_id = 1

cursor.execute('
    SELECT "Indicator"."indicator" 
    FROM "Indicator" 
    WHERE "Indicator"."some_id" =   %s;', (some_id, ))
于 2018-06-18T01:17:30.067 回答
0

使用Django时略有类似的错误:

TypeError: 'RelatedManager' object does not support indexing

这不起作用

mystery_obj[0].id

这有效:

mystery_obj.all()[0].id

基本上,错误显示为Some type xyz doesn't have an __ iter __ or __next__ or next function, so it's not next(), or itsnot[indexable], or iter(itsnot),在这种情况下, to 的参数cursor.execute需要实现迭代,最常见的是List, Tuple,或者不太常见的Array,或者一些自定义迭代器实现。

在这种特定情况下,当经典字符串插值填充%s, %d,%b字符串格式化程序时会发生错误。

有关的:

于 2018-12-11T07:40:50.450 回答
0

将参数传递到可索引的列表中。

cur.execute("select * from tableA where id =%s",[parameter])
于 2022-01-21T19:10:35.557 回答