在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 后来。 例如,我们很可能会在apiapp中包含此项,因此前缀是/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,)

本质上,自然的关键通常是独特领域和或 在一起是唯一的,但需要更加详细。

用法

要使数据同步工作,您需要注册 同步。 仅注册不敏感的模型,如复制。从不同步敏感 模型,例如用户,因为它可以公开非常敏感的数据

要注册模型,您需要装饰它们并使用自定义管理器。

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。

datasyncenhancedmanager只添加了一个get_by_natural_key方法,而没有其他方法 否则,

工作任务

当代码部署到gae(并且仅gae,flex和kube还不受支持)时, 数据同步自动使用队列ID为数据同步的云任务

设置和配置

数据同步应在没有其他设置的情况下工作 (如果使用默认的同步模式)。

如果您部署到gae,它会自动使用云任务, 您应该填写下面的选项。

选项

DATA_SYNC_SERVICE_ACCOUNT_EMAIL

默认为`(空字符串)。您需要填写GCP服务帐户。 您可以使用GAE默认服务帐户。 需要按照建议进行OIDC验证 按GCP。

DATA_SYNC_FORCE_SYNC

默认为false。如果要使用synchronous,请将其设置为true 部署到GAE时。

pip install django-data-sync
0

默认为数据同步

pip install django-data-sync
1

默认为Europe-West1

pip install django-data-sync
2

默认值为env var ofgoogle_cloud_project

pip install django-data-sync
3

默认为gae_version的env var值,该值已由gae设置。

pip install django-data-sync
4

默认为gae_service的env var值,该值已由gae设置。

数据源

数据源保存有关您希望从中 要同步的数据。

url取决于您在何处以及如何在 安装阶段。

例如,如果在apiapp urlpatterns中包含data_sync.url, 然后,数据源中的url必须附加apiurl。 因此,它可能看起来像这样https://example.com/api

如果在根目录中包含数据同步url,则数据源url将 像这样https://example.com

不包括斜杠。

同步

要进行同步,只需创建一个数据拉取

兼容性

Python 3.7、Django 2.2及以上版本

测试

无自动测试(尚未……)。

要进行本地测试,可以生成两个具有不同端口和 不同的数据库并相应地设置数据源。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java 安卓碎片问题   java获取通过字符串删除的内容。replaceAll()   java中的三角形数   JavaSpringbean作用域:会话和全局会话   java为什么JavaBeans不序列化类型列表中的属性?   java无法使用Spring和Thymeleaf在视图上传输对象   Java中变量内部的变量   java在Eclipse上调整黄盒大小并保持其大小   java使用Jackson将名称-值对数组反序列化为对象   安卓 Java多变量长度参数   java JavaFX版本的“isDescendingFrom(组件a、组件b)”   java如何在春季发送多个PDF?   java以不同的格式为联系人分配相同的号码   如何从打包到自己的java库中访问资源的文件。罐子   java模块化反射公共闭包原理   java应用程序在使用进程时停止响应。等待()   java React setState不工作,出现错误