Почему удаляются записи в базе данных?

Ссылка скопирована
1 ответ

Столкнулся с такой проблемой, при добавлении новых данных в БД - удаляются старые.

Суть проекта такая, мне от мобильного приложения приходит 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
    Кирилл JS Ответ

    Удаление записей в базе данных может происходить по разным причинам, и разберем основные из них:

    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();
    ?>

    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(); ?>

    Надеюсь, что данное объяснение поможет вам понять возможные причины удаления записей из базы данных и как их избежать. Если у вас возникли дополнительные вопросы, не стесняйтесь задавать.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно