postgresql TypeError:“int”对象不支持索引

m3eecexj  于 2023-03-08  发布在  PostgreSQL
关注(0)|答案(8)|浏览(258)

我有这样的疑问:

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是一个整型值,但我希望选择some_id = 1的指标(或者我决定在变量中放入的任何#)。

whitzsjs

whitzsjs1#

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

这就把some_id参数变成了一个列表,它是可索引的。假设你的方法像我想的那样工作,这应该会起作用。
发生错误是因为在那个方法的某个地方,它可能试图迭代那个输入,或者直接索引到它。可能是这样的:some_id[0]
通过使它成为一个列表(或可迭代的),您允许它像这样索引到第一个元素。
您也可以通过执行以下操作将其转换为元组:(some_id,),其具有不可变的优点。

wfveoks0

wfveoks02#

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

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

dddzy1tm3#

你的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, ))
wr98u20j

wr98u20j4#

使用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字符串格式化程序时,会发生错误。
相关:

xytpbqjk

xytpbqjk5#

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

cur.execute("select * from tableA where id =%s",[parameter])
zphenhs4

zphenhs46#

我有同样的问题,它的工作时,我使用正常的格式。

cursor.execute(f'
    SELECT "Indicator"."indicator" 
    FROM "Indicator" 
    WHERE "Indicator"."some_id" ={some_id};')
yxyvkwin

yxyvkwin7#

some_id类型转换为string也可以。

cursor.execute(""" SELECT * FROM posts WHERE id = %s """, (str(id), ))
tyg4sfes

tyg4sfes8#

指定可能有效的vars=参数:

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

相关问题