Обновление значения ключа в JSONField()
Я пытаюсь обновить большое количество записей (3,2 миллиона).
Это моя модель:
class MyModel(models.Model):
stats = JSONField()
Где статистика обычно сохраняется как:
{
"my_old_key": [{"hey": "Hello World"}]
}
Я хочу обновить его так, чтобы только ключ менял свое значение, и конечная статистика выглядела следующим образом (хотя уже есть записи с "my_new_key"
, поэтому желательно их как-то пропустить):
{
"my_new_key": [{"hey": "Hello World"}]
}
Я могу сделать это в Python, но это работает очень медленно... Я пробовал на ~10k записях с пакетным подходом из этой ссылки, чтобы набор запросов не был полностью загружен в память. Окончательное решение выглядело так:
def update_queryset(queryset) -> None:
for stat in queryset:
dictionary = stat.stats
if "my_old_key" in dictionary:
dictionary["my_new_key"] = dictionary.pop("my_old_key")
stat.save()
Это действительно работает, но, к сожалению, работает слишком медленно :(.
Я думал о том, чтобы вообще не передавать его в python и работать только с базой данных примерно так, как предложено в этом ответе но не смог заставить его работать
Есть предложения, как я могу ускорить это / написать RawSQL / заставить подход jsonb_set
работать?
def update_queryset(queryset) -> None:
for stat in queryset:
stat.stats["my_new_key"] = stat.stats.pop("my_old_key")
MyModel.objects.bulk_update(queryset, ['stats'])