Подтвердить что ты не робот

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 (или что-то еще, что я решил разместить в переменной).

4b9b3361

Ответ 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, или некоторую пользовательскую реализацию итератора.

Связанные с: