mysql - 全局单一元素的最佳数据库实践?
问题描述
我最近一直在开发一个全局依赖于一个不断变化的值列表的 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)
我的问题来自那种情况,它看起来很乱,因为我事先知道它是一个单一的对象,所以我认为可能有更适合用于对象的东西(顺便说一句,它保证存在,整个业务逻辑取决于此),而不是创建模型,创建表然后搜索第一个元素(如果存在)。
有没有更好的方法来存储和检索单个对象?谢谢!
解决方案
好吧,既然您保证只有一个元素,您可以执行 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 )中。
推荐阅读
- python - Python 中是否有 networkx 和/或 igraph 函数用于查找图的 Alpha 和 Bonacich 功率中心?
- html - 我如何将它组合在一张桌子上?
- java - Java REGEX appendReplacement() 方法不接受第二个参数中的变量
- verilog - Verilog:连接端口的正确方法
- c - 通过 Winsock 将字符串发送到 HDFS
- python - 传递列表后如何修复 append() 错误
- django - 视图没有返回 HttpResponse 对象。它返回 None 而不是
- python-3.x - 使用 Python Boto3 在 Route53 的托管区域中更改记录集权重
- javascript - 如何在 React 中为一个请求保存多个表单?
- php - 致命错误:GRP php 扩展中超过了 30 秒的最大执行时间