2013-08-20 2 views
25

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

ответ

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

Это превращает параметр some_id в список, который является индексируемой. Предполагая, что ваш метод работает так, как я думаю, это должно сработать.

Ошибка происходит потому, что где-то в этом методе она, вероятно, пытается перебрать этот вход или указатель непосредственно в него. Возможно, вот так: some_id[0]

Составив список (или итерабельный), вы можете его индексировать в первый элемент, подобный этому.

Вы также можете сделать это в кортеж, выполнив это: (some_id,), который имеет то преимущество, что он неизменен.

+0

Спасибо! просто пара [] меняет все, что я предполагаю ... – nlr25

22

Вы должны передать параметры запроса execute() как кортеж (итератор, строго говоря), (some_id,) вместо some_id:

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

Запятая делает ВСЕ разницу. Не понял, что один кортеж не превращается в кортеж без запятой ... –