将 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 任务参数传递吗?

使用类方法作为 celery 任务

为啥使用 Celery 运行计划任务比使用 crontab 更可取?

将图像传递给 celery 任务

为啥 Celery 守护进程看不到任务?

芹菜 - 无法获取任务结果