Решение TypeError: 'int' object не поддерживает индексацию в SQL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Ошибки типа возникают, когда мы попытываемся применить индексацию, такую как var[0], к типу данных, который не предусматривает такого рода операции, например к целочисленному значению в Python. Особенно часто так происходит при обработке результатов SQL-запросов. Для избежания этого убедитесь, что не обрабатываете неиндексируемые типы данных, включая целые числа, как если бы это были массивы. Когда в результате выполнения SQL-запроса вы получаете единственный элемент, не стоит относиться к нему как к массиву:

Ниже примеры получения одного целого числа из запроса:

Python
Скопировать код
# SQL подтверждает: вот ваш результат, начальник 📊
result = cursor.execute("SELECT COUNT(*) FROM table").fetchone()
print(result)  # Индекс не требуется, просто выводим результат

Если результат запроса возвращает кортеж с одним элементом, дайте ему "подышать":

Python
Скопировать код
# SQL сообщает: мы пришли вдвоём, но важен только один 🤝
count, = cursor.execute("SELECT COUNT(*) FROM table").fetchone()
print(count)  # Это число просто нужно напечатать
Кинга Идем в IT: пошаговый план для смены профессии

Руководство по передаче параметров в SQL-запросы

Моменты работы с базами данных через Python DB-API, связанные с передачей параметров, могут вызывать ошибки типа.

Правила использования плейсхолдеров

При передаче параметров используйте плейсхолдеры %s или ?, оформив их в кортеж:

Python
Скопировать код
# SQL ждет формальностей: Излагайте свои мысли ясно 🎩
cursor.execute("SELECT * FROM my_table WHERE id = %s", (some_id,))

Используя библиотеку sqlite3, действуйте следующим образом:

Python
Скопировать код
# SQL играет в детективов: Итак, кто передо мной? 🕵️‍♀️
cursor.execute("SELECT * FROM my_table WHERE id = ?", (some_id,))

Корректный доступ к данным

При работе с Django ОРМ делайте следующим образом:

Python
Скопировать код
# Модельный запрос ID: могу я узнать ваше имя? 🎟️
instance_id = MyModel.objects.all()[0].id

Избегайте тривиальных ошибок:

Python
Скопировать код
# Попытка пощекотать целое число: стоп, это неприемлемо! ✋
instance_id = MyModel.objects.all()[0].id[0]  # Приведёт к ошибке типа

Интерполяция строк – коробка Пандоры

Интерполяция строк может привести к ошибкам типа:

Python
Скопировать код
# Вследствие неудачной попытки индексировать целое число 😬
query = f"SELECT * FROM my_table WHERE id = {some_id[0]}"  # Это ошибка, если some_id – это int

Доверяйте подстановке параметров проверенными способами, которые были описаны выше.

Основные правила безопасности SQL-запросов

При работе с SQL в Python существуют непременные правила, которые помогут избежать ошибок типа и других распространённых недоразумений.

Законы итерации Python

Соблюдайте принципы итерации Python, чтобы избежать ошибок, связанных с типами данных, для которых итерация неприменима.

Правила использования форматтеров

Помните, что str.format, f-строки и форматтеры % – это ваш ключ к корректной постановке запросов.

Магический cursor.execute()

Обратите внимание на функцию cursor.execute(). Убедитесь, что используете её правильно, следуя рекомендациям Python DB-API.

Визуализация

Представим ситуацию: ваша задача – выбрать фрукт из корзины, но у вас в руках только число:

Markdown
Скопировать код
У вас есть 5, а нужно яблоко 🤔❓

Так можем охарактеризовать взаимодействие с SQL, когда вы относитесь к объекту типа int как к array:

Python
Скопировать код
# У вас есть число 5, цель – найти яблоко 🍎
number = 5  # 🍏 Есть число.
number[0]   # 🚫 Ошибка. Что это вообще значит?

Вы надеялись извлечь объект из коллекции, но на самом деле пытаетесь это делать из одного числа:

Markdown
Скопировать код
Ожидание: Выбрать яблоко из корзины 🍎✔️
Реальность: Вы "выбираете" яблоко из числа пять ❌

Суть важна: Поймали уловку? Индексация int – это бессмысленно, как поиск главы в одной странице.

🚫 И ошибка типа как бы говорит вам об этом 🚫

Разбор типичных причин ошибок

Рассмотрим, что обычно вызывает ошибки типа при работе с целыми числами и как эти ошибки можно предотвратить.

Работа с кортежами

Python
Скопировать код
# Как достойный кортеж, он желает уединения, а вы пытаетесь протиснуться 👨‍👦‍👦
single_value = (42,)
wrong_approach = single_value[0][0]  # Ошибка типа
correct_approach = single_value[0]   # С учётом личного пространства

Искусство распаковки

При работе с запросами, в которых ожидается получение одного значения, используйте распаковку:

Python
Скопировать код
# Вытаскиваем значение из запроса
age, = cursor.fetchone()

Взаимодействие с результатами SQL-запросов

Если от запроса ожидается только одно значение и вы используете метод fetchone(), будьте внимательны с полученным кортежем:

Python
Скопировать код
rows = cursor.execute("SELECT MAX(age) FROM people").fetchone()
# Возраст – это всего лишь число... пока что 🤷‍♀️
max_age = rows[0] if rows else None

Полезные материалы

  1. Built-in Exceptions — Документация Python 3.12.1 — Описание исключения TypeError в Python: пояснения и причины возникновения.
  2. Инструменты отладки Python – Python Wiki — Узнайте об инструментах отладки Python, которые помогут вам при исправлении ошибки типа TypeError.
  3. Работа со списками в Python для новичков – PythonForBeginners.com — Введение в основы работы со списками в Python без ошибок типа.
  4. Учебник по работе с объектно-реляционными отношениями — Документация SQLAlchemy 2.0 — Изучите взаимодействие с SQL на языке Python и узнайте о тонкостях, связанных с некорректной индексацией.
  5. Medium — Путь к пониманию и устранению распространённых ошибок Python.