Почему удаляются записи в базе данных?
Столкнулся с такой проблемой, при добавлении новых данных в БД - удаляются старые.
Суть проекта такая, мне от мобильного приложения приходит JSON, я его распихиваю по базе данных. Потом я рендерю на сайте табличку из excel файла, где 1 строка таблицы - светильник. Потом я цветом обозначаю результат действия над светильником (успешно или нет) и генерирую историю действий со светильником.
Так вот, если уже были действия с 3 светильником (3 строка таблицы), и выполнить действия с 4 светильником, то пропадают данные о 3-ем, и наоборот. При чём такая проблема только с этими светильниками, с остальными всё нормально.
Я предполагаю, что проблема кроется в функции handle_mobile_request при создании записи в модели Support, а конкретнее из-за использования метода update_or_create, потому что когда я изменил его на create, то данные перестали пропадать, но, соответственно в базе данных появилась куча одинаковых записей и перестала работать история действий. Я полагаю, что запись просто обновляется и перезаписывает те данные, которые отличаются у этих светильников, что достаточно странно, ведь тогда точно такая же история была бы и с остальными светильниками
скрин таблицы с сайта:
модели и представления:
https://gist.github.com/Flipzzzy/f5bd4b11fe006b9fe...
Дополнительно:
Сильно палками за говно-код не бейте
Но ведь именно он является главной причиной, почему ошибку найти так трудно.
Видимо я сам нашёл решение, проблема была в том, что при создании записей в таблице support у меня был указан метод update_or_create. В условиях, по которым он искал существующие записи были указаны только данные, которые могут повторяться от записи к записи, соответственно, я добавил в параметры поиска ещё данные, которые теперь делали поиск уникальным.
было:
coordinates = data.get('CoordinatesSupport', '').split(', ') if len(coordinates) == 2: support_latitude, support_longitude = map(float, coordinates) Support_instance, support_created = Support.objects.update_or_create( support_number=float(data['NumSupport']), defaults={ 'power_group': Power_Group_instance, 'power_station': Power_Station_instance, 'control_address': Control_Address_instance, 'support_latitude': support_latitude, 'support_longitude': support_longitude, } ) |
coordinates = data.get('CoordinatesSupport', '').split(', ') if len(coordinates) == 2: support_latitude, support_longitude = map(float, coordinates) Support_instance, support_created = Support.objects.update_or_create( support_number=float(data['NumSupport']), defaults={ 'power_group': Power_Group_instance, 'power_station': Power_Station_instance, 'control_address': Control_Address_instance, 'support_latitude': support_latitude, 'support_longitude': support_longitude, } )
стало:
coordinates = data.get('CoordinatesSupport', '').split(', ') if len(coordinates) == 2: support_latitude, support_longitude = map(float, coordinates) Support_instance, support_created = Support.objects.update_or_create( support_number=float(data['NumSupport']), support_latitude=support_latitude, support_longitude=support_longitude, defaults={ 'power_group': Power_Group_instance, 'power_station': Power_Station_instance, 'control_address': Control_Address_instance, } ) |
coordinates = data.get('CoordinatesSupport', '').split(', ') if len(coordinates) == 2: support_latitude, support_longitude = map(float, coordinates) Support_instance, support_created = Support.objects.update_or_create( support_number=float(data['NumSupport']), support_latitude=support_latitude, support_longitude=support_longitude, defaults={ 'power_group': Power_Group_instance, 'power_station': Power_Station_instance, 'control_address': Control_Address_instance, } )
если этот ответ отмечен решением, то он и является правильным ответом
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Удаление записей в базе данных может происходить по разным причинам, и разберем основные из них:
1. Ошибки в коде: Одной из основных причин удаления записей в базе данных может быть наличие ошибок в коде приложения. Например, если запрос на удаление записи был неправильно составлен или содержит ошибку, то это может привести к удалению некорректных данных.
2. Неправильное использование оператора DELETE: Иногда разработчики могут использовать оператор DELETE без указания условия WHERE, что приведет к удалению всех записей из таблицы. Это может произойти из-за недосмотра или невнимательности.
3. Несанкционированный доступ: Если база данных не защищена должным образом, злоумышленники могут получить доступ к ней и удалить записи. Поэтому важно обеспечить безопасность базы данных и регулярно проверять наличие уязвимостей.
4. Непреднамеренное удаление: Иногда сотрудники могут случайно удалить записи из базы данных из-за невнимательности или неправильных действий. В таких случаях важно иметь резервные копии данных, чтобы была возможность восстановить удаленную информацию.
Для предотвращения случайного удаления записей в базе данных рекомендуется использовать транзакции для гарантированного выполнения группы операций как единое целое. Также необходимо внимательно проверять и тестировать запросы на удаление перед их выполнением, чтобы исключить возможность удаления некорректных данных.
Приведу пример использования оператора DELETE с условием WHERE на языке PHP:
connect_error) { die("Connection failed: " . $conn->connect_error); } // Удаляем запись из таблицы $sql = "DELETE FROM users WHERE id = 1"; if ($conn->query($sql) === TRUE) { echo "Record deleted successfully"; } else { echo "Error deleting record: " . $conn->error; } // Закрываем соединение $conn->close(); ?>
Надеюсь, что данное объяснение поможет вам понять возможные причины удаления записей из базы данных и как их избежать. Если у вас возникли дополнительные вопросы, не стесняйтесь задавать.