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 (или что-то еще, что я решил разместить в переменной).
Ответы
Ответ 1
cursor.execute('
SELECT "Indicator"."indicator"
FROM "Indicator"
WHERE "Indicator"."some_id" = %s;', [some_id])
Это превращает параметр some_id
в список, который является индексируемым. Предполагая, что ваш метод работает, как я думаю, он должен работать.
Ошибка происходит из-за того, что где-то в этом методе она, вероятно, пытается перебрать этот ввод или указатель непосредственно в него. Возможно, это так: some_id[0]
Сделав его списком (или итерируемым), вы позволяете ему индексировать первый элемент, подобный этому.
Вы также можете сделать его в кортеж, выполнив это: (some_id,)
, который имеет преимущество в том, что он является неизменным.
Ответ 2
Вы должны передать параметры запроса execute()
в виде кортежа (итерабельно, строго говоря), (some_id,)
вместо some_id
cursor.execute('
SELECT "Indicator"."indicator"
FROM "Indicator"
WHERE "Indicator"."some_id" = %s;', (some_id,))
Ответ 3
Ваш идентификатор должен быть своего рода повторяемым, чтобы 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, ))
Ответ 4
Немного похожая ошибка при использовании 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 not next(), or itsnot[indexable], or iter(itsnot)
, в данном случае это аргументы к cursor.execute
потребовалось бы реализовать итерацию, чаще всего List
, Tuple
или, реже, Array
, или некоторую пользовательскую реализацию итератора.
Связанные с: