Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django数据库同步用于脱机使用_Django_Data Synchronization - Fatal编程技术网

django数据库同步用于脱机使用

django数据库同步用于脱机使用,django,data-synchronization,Django,Data Synchronization,我有一个主django服务器,用于存储数据(mysql数据库) 联机:我希望许多用户在笔记本电脑(sqlLite DB)上同步此数据库的副本(只需复制增量) 脱机(用户无权访问主服务器):用户可以查看和更新其本地数据库 返回联机:用户笔记本电脑上修改的内容将同步回主django服务器 我认为,由于我有两种数据库,我需要在django对象级别进行同步。 是否有django应用程序可以这样做? 如果没有,您将如何编写这样一个功能?嗯,我实际上不知道是否有django应用程序可以做到这一点,但我将这样

我有一个主django服务器,用于存储数据(mysql数据库)

联机:我希望许多用户在笔记本电脑(sqlLite DB)上同步此数据库的副本(只需复制增量)

脱机(用户无权访问主服务器):用户可以查看和更新其本地数据库

返回联机:用户笔记本电脑上修改的内容将同步回主django服务器

我认为,由于我有两种数据库,我需要在django对象级别进行同步。 是否有django应用程序可以这样做?
如果没有,您将如何编写这样一个功能?

嗯,我实际上不知道是否有django应用程序可以做到这一点,但我将这样继续:

创建“脱机更新”方法:连接到服务器数据库时,选择id与本地数据库中id匹配的所有对象。您可以更新本地数据库。然后选择其余的条目,并将它们添加到本地数据库中

为“在线更新”创建一个方法,使用相同的例程,反向

优点:易于实现(Objects.all()获取所有内容,然后进行操作和更新,或直接保存)

缺点:竞争条件(如果两个用户更新相同的条目(不一定在同一时间)?谁更新得最多?)

您基本上创建了一种“mysql svn”,以保持这两个数据库的更新


我对你的问题投+1票,因为它真的很有趣。我一直通过转储数据库(通过mysql)然后加载到本地数据库来工作。不使用django。

结果表明,我在django中运行这样的系统

这不是一个完整的答案,只是目前正在解决(大部分)问题的答案

  • 对主键使用UUID。这将大大减少不同对象的主键碰撞
  • 使用Django的序列化框架进行数据交换。中央管理站点可以选择将变更列表中的选定对象下载到与Django兼容的序列化文件中。然后用户可以脱机并启动本地管理站点,然后在那里上传序列化文件。完成脱机版后,将使用相同的过程,在“脱机”管理站点中,将对象序列化为文件,并将对象上载到管理中心站点
  • 序列化框架非常有用,因为您可以获得一个实际的(未保存的)对象,然后决定是否保存它,并在保存之前修改一些字段
我们在这个简单的系统中遇到的问题很少,这也很有帮助,因为内容是正确分类的,编辑器只创建/编辑一组不重叠的类别

我与一些人就此进行了交谈,并向我提出了几种解决方案:

  • 使用时间戳字段:帮助决定保存哪个版本和放弃哪个版本
  • 使用版本字段,包括主要版本号和次要版本号。次要编辑(如拼写更正)仅更新次要版本号,而主要更改将更新主要版本号并将次要版本号设置为0。这样,在比较时,你总是知道哪一个优先级更高。然而,这需要编辑用户的教育和约定
  • 对象更新。一个单独的模型,用于存储来自脱机编辑的更新。然后,一个“首席”编辑器将它们合并到实际对象中,并通过一些额外的管理视图来查看差异(使用google diff match补丁等)。还可以标记对象以允许直接更新,即不存储更新,并在到达时直接应用更新。不便之处在于“主编”必须审查所有更新,这取决于更新了多少信息

希望这能有所帮助。如果有人决定实现这一点,我很乐意听取他的意见。

我构建了一个Django应用程序,可以实现这一点。在应用程序的远程/笔记本电脑版本上创建模型实例时,它们会被标记为脏,并获得临时id。远程应用程序会定期检查与主服务器的连接。当存在网络连接时,即应用程序联机时,它会从主服务器获取每个新脏模型实例的永久id。将临时ID替换为永久ID,然后将脏实例同步到主机

我使用Django REST框架来接收和更新主服务器上的脏模型实例


请注意,这还需要在脱机计算机上运行本地web服务器。我选择CherryPy就是为了这个。

还有一个问题:我认为使用对象的主键不是一个好主意:因为许多用户可以更新主数据库,而其他一些用户更新他们的脱机数据库,所以即使对象不同,主键也可能发生冲突。是的,基本上,我的只是一个例子每种形式的“竞争条件”都是一个问题……是的,我同意UUID的原则:这是在许多计算机上获得相同id的对象的唯一方法。但我需要更自动化的东西……我将不得不更多地考虑这一点……+1对于UUID——这是一流的db类型,如果您使用PostgreSQL作为RDBMS。我是一个粉丝。