将 json 作为 celery 任务的一部分插入 postgres
Posted
技术标签:
【中文标题】将 json 作为 celery 任务的一部分插入 postgres【英文标题】:Insert json into postgres as part of celery task 【发布时间】:2019-02-05 20:54:26 【问题描述】:我是 Django 和 Celery 的新手。
高级:
我正在开发一个 Django 应用程序。从管理页面使用将提交请求(作业)。这些请求将被发送到 Redis。然后 Celery 将轮询 Redis 并从队列中拉出一个作业。任务完成后,结果将存储在 postgres 中。
这是一个示例任务,用于通过 pytest.main() 启动一些测试。
# task for running tests by marker
def run_tests_mark(test_marker):
os.chdir('/service/lib/tests')
# only allow specific strings to be passed in by the user
if test_marker not in ['smoke', 'regression']: # update as more tages are introduced to the project
return 'You have entered an invalid term. Please use either smoke of regression.'
# run pytest command with self contained reporting
results = pytest.main(['-v', '--json-report', '-m', test_marker])
# TODO: after tests run send json report to postgres
代码将运行测试,但正如您在最后一条评论中看到的那样,我想获取生成的 .json.report 并将其存储在 postgres 数据库中 [请注意,我使用帮助程序来获取由results
]
现在我感到困惑。
我是否需要首先根据 pytest 生成的 json 报告中的所有键创建一个模型?
如果是这样,我会使用TestResultModel.objects.create(.....)
之类的东西然后将报告插入到 postgres 中吗?
这是 pytest.main 输出的 json 示例
“创建”:1535570420.542123,“持续时间”:215.14111948013306, “退出代码”:1,“根”:“/test”,“环境”:“Python”:“3.6.6”, "平台": "Linux-4.9.93-linuxkit-aufs-x86_64-with-debian-9.5", “包”:“pytest”:“3.6.2”,“py”:“1.5.4”,“pluggy”:“0.6.0”, “插件”:“xdist”:“1.22.5”,“元数据”:“1.7.0”,“json-report”: “0.7.0”、“forked”:“0.2”、“django”:“3.3.3”、“cov”:“2.5.1”、“celery”: "4.2.1", "summary": "passed": 34, "failed": 7, "total": 41
【问题讨论】:
【参考方案1】:我是否需要先根据 pytest 生成的 json 报告中的所有键创建模型?
通常答案是肯定的。但它看起来不像您保存在数据库中的关系数据。因此,您可以使用JSONField 并一次性将所有内容插入其中。 JSONField 对应于 postgresql 中的 JSONB 字段,旨在存储 json 对象并允许搜索、修改这些对象等。
您可能还想查看https://***.com/a/32091771/267540
【讨论】:
非常感谢您的建议。我将集中精力实现这一点。 很高兴能帮上忙以上是关于将 json 作为 celery 任务的一部分插入 postgres的主要内容,如果未能解决你的问题,请参考以下文章
可以将 OrderedDict 作为 Celery 任务参数传递吗?