Лучшие практики баз данных для единого глобального элемента? - PullRequest
0 голосов
/ 04 июня 2018

Недавно я разрабатывал приложение Django (с использованием MySQL), которое в глобальном масштабе зависит от одного постоянно меняющегося списка значений.Я сохраняю их в поле JSON, которое выглядит примерно так:

{'value1':0.123, 'value2':2.33214, ...}

Я использую задание cron, которое запускается 24/7 и извлекает этот объект один раз в начале, а затем обновляет его каждую секунду.Для этого я делаю что-то вроде

L = ValuesList.objects.all().first()
if L is None:
    L = ValuesList.objects.create(my_json=some_default)

И этот код в значительной степени присутствует всякий раз, когда я хочу получить значения.Если это выглядит плохо, я даже делал

try:
    L = ValuesList.objects.get(id=1)
catch:
    L = ValuesList.objects.create(my_json=some_default)

Мой вопрос возникает из-за этой ситуации, он выглядит грязно, потому что я заранее знаю, что это ОДИН объект, поэтому я подумал, что может быть что-то более подходящее для использованиядля объекта THE (который, кстати, гарантированно существует, от этого зависит вся бизнес-логика) вместо создания модели, создания таблиц и последующего поиска первого элемента, если он существует.

Есть ли лучший способ, которым я не знаю, для хранения и извлечения одного объекта?Спасибо!

1 Ответ

0 голосов
/ 04 июня 2018

Хорошо, поскольку вы гарантируете, что существует только один элемент, вы можете выполнить .get(..) без любой фильтрации.

В случае, если объект не существуетМы хотим выполнить create.Мы можем объединить их с get_or_create:

L, created = ValuesList.objects.<b>get_or_create(
    defaults={
        'my_json': some_default
    })</b>

В зависимости от используемой вами системы базы данных, это может быть выполнено с помощью single запрос.Он будет пытаться получить единственный объект (нам не нужно фильтровать, так как он гарантирован, что есть только один).Если он не существует, Django создаст экземпляр со значениями в словаре defaults в качестве начальных значений.

Функция возвращает 2-кортеж с первым элементомобъект (извлечен или создан, здесь L), а в качестве второго элемента - логическое значение, указывающее, был ли объект создан (здесь created).

Вы можете инкапсулировать эту логику в классе модели (например,@classmethod), который позволяет нам получить один экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...