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

时间:2017-06-02 02:37:16

标签: python django database development-environment wagtail

我有一个有三种环境的Django网站(本地,分期,制作)。

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

执行数据库备份还原不是合规性原因的选项。

但是,我们在本网站上也有一些我们使用Wagtail CMS管理的内容页面。

我正在寻找一种方法,可以在需要时将生产数据(只有一些模型,特别是wagtail页面)同步回Staging and Developers本地环境。

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

示例:./manage.py sync_from_prod BlogPost这将在本地或登台环境中找到所有缺少的博文,并将在数据库中创建它们。我找不到任何为Wagtail或Django这样做的库。

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

如果不存在,我可能会尝试编写我自己的django-model-sync(发现这个项目,但是3岁并兼容到django 1.7,我在python3 django 1.11上)

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

2 个答案:

答案 0 :(得分:1)

您可以对要复制的模型使用命令dumpdata

在生产命令./manage.py dumpdata app_name.model_name > model_name.json中使用。这会将所选数据库表的所有数据保存在文件model_name.json中。 然后在本地或阶段服务器上使用loaddata来处理此文件: ./manage.py loaddata model_name.json

您可以在此处了解更多信息:https://the-bosha.ru/2016/06/29/django-delaem-damp-bazy-dannykh-i-vosstanavlivaem-iz-nego-s-dumpdata-i-loaddata/ (仅限俄语说明)

答案 1 :(得分:0)

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

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

PSEUDO CODE:

# 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')