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

时间:2011-07-29 08:11:54

标签: django data-synchronization

我有一个存储数据的主django服务器(mysql数据库)。

在线:我希望很多用户在他们的笔记本电脑上同步(只需要复制delta)来复制这个数据库的副本(sqlLite DB)

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

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

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

3 个答案:

答案 0 :(得分:3)

原来我在Django中运行这样的系统。

这不是一个完整的答案,只是目前解决(主要是)问题的答案。

  • 将UUID用于主键。这会大大减少不同对象的主键冲突。
  • 使用Django的序列化框架进行数据交换。中央管理站点可以选择将更改列表中的选定对象下载到与Django兼容的序列化文件中。然后用户可以离线并启动本地管理站点,然后上传序列化文件。完成离线版后,使用相同的过程,在“离线”管理站点中,对象被序列化为文件,并上传到中央管理站点。
  • 序列化框架非常有用,因为您可以获得实际(和未保存)的对象,然后决定是否保存它,并在保存之前修改某些字段。

我们在这个简单的系统上遇到了很少的麻烦,也有帮助,因为内容被正确分类,编辑只创建/编辑一组非重叠的类别。

我和一些人谈过这个问题,并提出了几个解决方案:

  • 使用时间戳字段:这有助于确定要保存的版本和要丢弃的版本。
  • 使用带有市长和次要版本号的版本字段。次要编辑(如拼写更正)仅更新次要版本号,主要更改更新市长版本号并将次要设置为0.这样,在比较时,您始终知道哪个获得更高的优先级。但是,这需要编辑用户的教育和约定。
  • 对象更新。一个单独的模型,用于存储来自离线编辑的更新。然后一个'主'编辑器将它们合并到实际对象中,帮助一些额外的管理员视图来查看差异(使用google-diff-match-patch等)。还可以标记对象以允许直接更新,即不存储更新并在到达时直接应用它们。不便之处在于“首席”编辑必须检查所有更新,这取决于更新的信息量。

希望这在某种程度上有所帮助。如果有人决定实施这一点,我很乐意听取他的意见。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

好吧,我实际上不知道是否有django应用程序可以做到这一点,但我会这样做:

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

创建一个方法“online_update”相同的例程,倒置。

PRO:易于实现(Objects.all()可以获取所有内容,然后您可以操作和更新,或直接保存)

缺点:竞争条件(如果2个用户更新相同的条目(不一定在同一时间)怎么办?谁拥有最新的一个?)

你基本上创建了一种“mysql-svn”来保持2个数据库的更新。

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