TypeError:'int'对象不支持索引

时间:2013-08-20 22:14:52

标签: python sql postgresql

我有这个问题:

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 个答案:

答案 0 :(得分:34)

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

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

错误正在发生,因为在该方法的某个地方,它可能试图迭代该输入,或直接索引到它。可能是这样的:some_id[0]

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

你也可以这样做:(some_id,)具有不可变的优势。

答案 1 :(得分:26)

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

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

答案 2 :(得分:2)

你的id需要某种可迭代的mogrify才能理解输入,这里是frequently asked questions documentation的相关引用:

>>> 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, ))

答案 3 :(得分: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),在这种情况下,cursor.execute的参数将需要实现迭代,最常见的是ListTuple或更少的迭代。 Array或某些自定义迭代器实现。

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

相关: