🐛 Типичные ошибки

⚡ Кратко

Сверяйте сообщение об ошибке с причиной и исправлением. Воспроизведите хотя бы одну ошибку самостоятельно и затем устраните её.

❌ Ошибка 1: закрытие соединения до курсора

connection.close()
cursor.close()

Сообщение об ошибке: InterfaceError: Connection already closed или cursor просто не сможет работать.

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

✅ Исправление

cursor.close()
connection.close()

Что изменилось: закрываем сначала курсор, потом соединение. Ещё лучше — использовать with.

❌ Ошибка 2: пропуск commit() после изменяющего запроса

cursor.execute("INSERT INTO products (name) VALUES ('Pen')")
cursor.close()
connection.close()

Почему возникает: программа завершается без ошибок, но новая строка в таблице не появляется.

✅ Исправление

cursor.execute("INSERT INTO products (name) VALUES (%s)", ("Pen",))
connection.commit()
cursor.close()
connection.close()

Что изменилось: после INSERT/UPDATE/DELETE вызван connection.commit(), который фиксирует транзакцию.

❌ Ошибка 3: путаница в методах fetchone() и fetchall()

cursor.execute("SELECT * FROM products")
row = cursor.fetchall()
print(row["name"])

Сообщение об ошибке: TypeError: tuple indices must be integers or slices, not str или list indices must be integers.

Почему возникает: fetchall() возвращает список, а fetchone() — один кортеж. Нельзя обращаться к списку как к строке.

✅ Исправление

cursor.execute("SELECT * FROM products")
rows = cursor.fetchall()
for row in rows:
    print(row[1])  # или row["name"] при DictCursor

Что изменилось: итерируемся по списку строк или используем fetchone(), если нужна одна запись.

❌ Ошибка 4: неочищенная коллекция MongoDB

collection.insert_many(products)

Почему возникает: при каждом запуске программы товары добавляются повторно, и в коллекции оказывается больше 3 документов.

✅ Исправление

collection.delete_many({})
result = collection.insert_many(products)

Что изменилось: перед вставкой удаляем все существующие документы из коллекции.

❌ Ошибка 5: неправильный оператор обновления в MongoDB

collection.update_many({}, {"price": 1.2})

Сообщение об ошибке: WriteError: Unknown modifier: $... или поле price заменяется на 1.2 вместо увеличения.

✅ Исправление

collection.update_many({}, {"$mul": {"price": 1.2}})

Что изменилось: использован оператор $mul, который умножает текущее значение. Альтернатива — агрегация с $set и вычислением.