❌ Ошибка 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 и вычислением.