将部分生产Django数据库复制到本地或登台

2024-06-07 16:56:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django网站,有3个环境(本地、登台、生产)。在

产品包含一些我不想让开发人员访问的数据(用户的个人数据和财务数据)。在

出于法规遵从性原因,执行数据库备份还原不是一个选项。在

不过,我们也有一些内容页面在这个网站上,我们管理与Wagtail CMS。在

我正在寻找一种方法来同步生产数据(只有一些模型,特别是wagtail页面)回到登台和开发人员本地环境,当他们需要的时候。在

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

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

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

如果什么都不存在,我可能会尝试编写我自己的django模型同步(找到这个项目,但是在django1.7和python3django1.11之前是3年前兼容的)

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


Tags: 数据django用户模型数据库manage环境产品
2条回答

您可以对要复制的模型使用命令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/(仅限俄语说明)

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

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

相关问题 更多 >

    热门问题