将生产 django 数据库的一部分复制到本地或暂存

Ben*_*nos 8 python database django development-environment wagtail

我有一个 Django 网站,有 3 个环境(本地、暂存、生产)。

生产包含一些我不希望我的开发人员访问的数据(用户的个人数据和财务数据)。

出于合规性原因,不可以选择执行数据库备份恢复。

不过,我们在该网站上也有一些内容页面,我们使用 Wagtail CMS 进行管理。

我正在寻找一种在需要时将生产数据(仅某些模型,但特别是 wagtail 页面)同步回暂存和开发人员本地环境的方法。

理想情况下,我会有一个可以在另一个环境中运行来复制数据的管理命令:

示例:./manage.py sync_from_prod BlogPost这将在本地或临时环境中找到所有丢失的博客文章,并在数据库中创建它们。我找不到任何库可以为 Wagtail 或 Django 执行此操作。

这似乎是一个常见问题,我很惊讶地发现没有 Stackoverflow 问题或开源库解决这个问题。

如果什么都不存在,我可能会尝试编写自己的 django-model-sync (找到了这个项目,但已有 3 年历史并且兼容直到 django 1.7,我使用 python3 django 1.11)

为了管理安全性,开发人员可以使用机密来访问公开数据(通过 ssl)的生产 API

Jam*_*Lin 0

您可以使用dumpdataprod 中的命令(或扩展命令)来获取博客数据的 JSON 导出,然后loaddata在本地使用命令将其保存到本地环境中。

如何实现工作流程完全取决于您,例如。您可能希望将dumpdata命令包装在 prod 上受保护的 API 中,然后sync_from_prod在本地环境中创建/运行命令来调用该 api 并call_command('loaddata', 'data_file.json')使用从 prod 导出的 JSON 数据执行该命令。

伪代码:

# the api view to provide the data on prod
def dumpdata_view(requst):
    output = StringIO.StringIO()
    call_command('dumpdata', output=output)
    output.seek(0)
    return JsonResponse(output.readlines()

# command to execute locally
class sync_from_prod(BaseCommand):
    def handle(self, *args, **kwargs):
        with open('data_file.json', 'w') as f:
            data = requests.get('https://prod/api/dumpdata?model=BlogPost')
            f.write(data.content)
        call_command('loaddata', 'data_file.json')
Run Code Online (Sandbox Code Playgroud)

  • 转储数据的问题在于您无法控制所获得的数据(没有过滤器,没有用于转换个人识别数据点的挂钩)。 (2认同)