首页 > 解决方案 > 全局单一元素的最佳数据库实践?

问题描述

我最近一直在开发一个全局依赖于一个不断变化的值列表的 Django 应用程序(使用 MySQL)。我将它们保存在类似的 JSON 字段中

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

我使用一个 24/7 运行的 cron 作业,它在开始时检索该对象一次,然后每秒更新一次。为此,我会做类似的事情

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)

我的问题来自那种情况,它看起来很乱,因为我事先知道它是一个单一的对象,所以我认为可能有更适合用于对象的东西(顺便说一句,它保证存在,整个业务逻辑取决于此),而不是创建模型,创建表然后搜索第一个元素(如果存在)。

有没有更好的方法来存储和检索单个对象?谢谢!

标签: mysqldjangodatabase

解决方案


好吧,既然您保证只有一个元素,您可以执行 a.get(..) 而不进行任何过滤。

如果对象不存在,我们要执行create. 我们可以将两者与 a 结合起来get_or_create

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

根据您使用的数据库系统,这可以通过单个查询来执行。它将尝试获取单个对象(我们不需要过滤,因为保证只有一个)。如果它不存在,Django 将创建一个实例,将defaults字典中的值作为初始值。

该函数返回一个 2 元组,第一个元素是对象(获取或构造,这里L),第二项是一个布尔值,指示对象是否被构造(这里created)。

@classmethod您可以将此逻辑封装在允许我们获取单个实例的模型类(例如 a )中。


推荐阅读