знаю как сравнить модели. Вот у меня список с 3к моделей старых и 3к новых с измененными данными.
Циклом for бежать по обьектам и искать i in old_models_list?
set(new_models_list) - set(old_models_list) получите новые, которых нет в старых
ну как бы и да... но из всех 30 полей там изменится может всего 1. Нужно ли апдейтить всю строку если можно апдейтить только 1 поле?) + есть вариант что в новых данных вообще исчезнет какая то запись или наоборот может добавится
не нужно, но разницу в производительности вы не заметите ключевое поле у таблицы есть?
да это уникальные id. правда там с инкрементацией какой то бред, начинаются идти по порядку (с пропусками видимо удаляются) до "id": "262" потом следом "id": "2875", "id": "499488", "id": "2257580", Ну и все в таком духе дальше))
Хотя реализация по-моему самая правильная. И работать будет как надо
old_id = {m.id for m in old_models} new_id = {m.id for m in new_models} added_id = new_id - old_id deleted_id = old_id - new_id models_to_insert = {m for m in new_models if m.id in added_id} models_to_delete = {m for m in old_models if m.id in deleted_id} models_to_update = set(new_models) - set(old_models) - models_to_insert в общем чето типа такого, навскидку. переизобретаем sql
только вот хорошо бы ещё не просто models_to_update а апдейт только тех полей которые изменились))
вы усложните код в разы, потратите время на питоне, и выиграете пару микросекунд в базе. оно того не стоит. на мой взгляд вообще всё написанное выше это дичь, это надо писать на sql и вообще не трогать питон.
СУБД источника какая?
Привет. Я тут попробовал реализовать предложенный тобой вариант. Модель пидантика не может содержатся во множестве Set. Она unhashable. Поэтому просто так вычесть не получиться(
Обсуждают сегодня