在django后端之间同步数据库
django-data-sync的Python项目详细描述
django数据同步
使您能够在 具有任何django后端的环境(只要模型定义是 同样)直接从管理界面。
免责声明
目前还没有严格的测试。我没有机会去探索 表现出复杂的关系。 目前已应用于两个生产级 模型不太复杂的项目 (许多尚未正确测试)。
请在同步时自行承担丢失数据的风险, 或者您可以在开发阶段进行严格的测试。
功能
- 使您能够在相同的django环境之间同步不敏感的数据 (只要模型定义相同)直接从管理界面
- 支持关系字段(需要测试多个)
- 同步同步或后台(仅支持云任务)
待添加
添加对imagefield和filefield的支持完成支持多任务队列,当前计划是支持GCP云任务完成- 在数据导出端点添加授权和身份验证
- 添加测试,因为无法在本地使用两个django服务器进行测试 (或者有?),我必须考虑如何正确执行此操作
可能会被添加
- 比较json中的数据以进行审核
- 添加对其他任务队列的支持,使其与云平台无关
安装
pip install django-data-sync
将数据同步添加到已安装的应用程序中
......'data_sync',........
运行迁移
python manage.py migrate data_sync
添加到urlpatterns。请注意将要使用的前缀url
后来。
例如,我们很可能会在api
app中包含此项,因此前缀是/api
path('',include('data_sync.urls')),
前言
数据同步通过使用自然密钥来工作。 因此,我强烈建议您在继续阅读之前,先阅读有关此主题的django文档。
您需要分析模型并定义它们的自然键。
通常可以从唯一字段(和/或unique_合在一起)推断它们的自然键。
定义为unique或在unique_中一起定义的字段可以由
仅使用字段名(如语言)与国家相关。
在语言定义上,
唯一的组合
通常是国家+语言的ISO 639-1。
在代码中,它看起来像这样
unique_together=(('country','code'),)
注意,unique中的country是抽象的。
什么定义了一个国家?
在unique_together的上下文中,它将是它们的id,但id不是自然键。
国家的天然钥匙应该是他们的ISO 2代码。
所以我们可以推断语言的自然键,通过编程,是 国家的ISO 2代码+语言的ISO 639-1
当您在代码中实现时,将如下所示
classLanguage(models.Model):defnatural_key(self):return(self.country.code,self.code,)
本质上,自然的关键通常是独特领域和或
要使数据同步工作,您需要注册
同步。
仅注册不敏感的模型,如复制。从不同步敏感
模型,例如用户,因为它可以公开非常敏感的数据 要注册模型,您需要装饰它们并使用自定义管理器。 在这里,您需要定义您的自然键(阅读前言了解更多主题)。 如果要限制
要同步的字段。 要将文件字段添加到数据同步中,请将它们添加到 看起来管理器初始化是在类加载时完成的。
因此,以编程方式添加自定义管理器可能会被认为是一件棘手的事情。
(我真的很喜欢在这方面的投入)。 现在,恐怕您必须定义自定义管理器
属性名,即 datasyncenhancedmanager只添加了一个 当代码部署到gae(并且仅gae,flex和kube还不受支持)时,
数据同步应在没有其他设置的情况下工作
(如果使用默认的同步模式)。 如果您部署到gae,它会自动使用云任务,
您应该填写下面的选项。 默认为`(空字符串)。您需要填写GCP服务帐户。
您可以使用GAE默认服务帐户。
需要按照建议进行OIDC验证
按GCP。
默认为 默认为数据同步
默认为 默认值为env var of 默认为 默认为 数据源保存有关您希望从中
要同步的数据。 url取决于您在何处以及如何在
安装阶段。 例如,如果在 如果在根目录中包含数据同步url,则数据源url将
像这样 不包括斜杠。 要进行同步,只需创建一个数据拉取 Python 3.7、Django 2.2及以上版本 无自动测试(尚未……)。 要进行本地测试,可以生成两个具有不同端口和
不同的数据库并相应地设置数据源。在一起是唯一的,但需要更加详细。
用法
fromdjango.dbimportmodelsimportdata_sync@data_sync.register_model(natural_key=['code'])classCountry(models.Model):objects=data_sync.managers.DataSyncEnhancedManager()code=models.CharField(max_length=2)# iso2........@data_sync.register_model(natural_key=['country.code','code'])classLanguage(models.Model):objects=data_sync.managers.DataSyncEnhancedManager()code=models.CharField(max_length=2)# iso 639-1........@data_sync.register_model(natural_key=['language.country.code','language.code','key'],fields=('value','key','language'),file_fields=('thumbnail',))classCopy(models.Model):objects=data_sync.managers.DataSyncEnhancedManager()language=models.ForeignKey(Language,on_delete=models.CASCADE)value=models.TextField()key=models.CharField(max_length=255)default=models.TextField()thumbnail=models.ImageField()........
@数据同步寄存器型号
如果自然键在相关字段中有值,则需要使用。(点)符号。文件字段
参数中。
datasyncenhancedmanager
对象
使用datasyncenhancedmanager。get_by_natural_key方法,而没有其他方法
否则,
工作任务
数据同步
自动使用队列ID为数据同步的云任务
设置和配置
选项
DATA_SYNC_SERVICE_ACCOUNT_EMAIL
DATA_SYNC_FORCE_SYNC
false
。如果要使用synchronous,请将其设置为true
部署到GAE时。
0
pip install django-data-sync
1
pip install django-data-sync
Europe-West1
2
pip install django-data-sync
google_cloud_project
3
pip install django-data-sync
gae_version
的env var值,该值已由gae设置。
4
pip install django-data-sync
gae_service的env var值
,该值已由gae设置。数据源
api
app urlpatterns中包含data_sync.url
,
然后,数据源中的url必须附加api
url。
因此,它可能看起来像这样https://example.com/api
https://example.com
同步
兼容性
测试
推荐PyPI第三方库