TypeError: объект 'int' не поддерживает индексирование
У меня есть этот запрос:
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 (или любой другой, который я решил бы добавить в переменную).
8 ответов
cursor.execute('
SELECT "Indicator"."indicator"
FROM "Indicator"
WHERE "Indicator"."some_id" = %s;', [some_id])
Это превращает some_id
параметр в список, который индексируется. Предполагая, что ваш метод работает так, как я думаю, он должен работать.
Ошибка возникает из-за того, что где-то в этом методе он, вероятно, пытается выполнить итерации по этому вводу или индексировать непосредственно в него. Возможно так: some_id[0]
Делая его списком (или итеративным), вы позволяете ему индексировать первый элемент подобным образом.
Вы также можете превратить его в кортеж, выполнив это: (some_id,)
который имеет преимущество быть неизменным.
Вы должны передать параметры запроса execute()
как кортеж (итеративно, строго говоря), (some_id,)
вместо some_id
:
cursor.execute('
SELECT "Indicator"."indicator"
FROM "Indicator"
WHERE "Indicator"."some_id" = %s;', (some_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, ))
Приведение типовsome_id
для строки также работает.
cursor.execute(""" SELECT * FROM posts WHERE id = %s """, (str(id), ))
У меня была такая же проблема, и она работала, когда я использовал обычное форматирование.
cursor.execute(f'
SELECT "Indicator"."indicator"
FROM "Indicator"
WHERE "Indicator"."some_id" ={some_id};')
Немного похожая ошибка при использовании 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
потребуется реализовать итерацию, чаще всего List
, Tuple
или реже Array
или какая-то пользовательская реализация итератора.
В этом конкретном случае ошибка возникает, когда классическая строковая интерполяция идет для заполнения %s
, %d
, %b
форматеры строк.
Связанные с:
Передать параметр в список, который можно индексировать.
cur.execute("select * from tableA where id =%s",[parameter])
Укажите аргумент vars=, который может работать:
cursor.execute("
SELECT "Indicator"."indicator"
FROM "Indicator"
WHERE "Indicator"."some_id" = %s', vars=[id] )