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

Eri*_*ric 20 django data-synchronization

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

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

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

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

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

Arm*_*ués 5

事实证明,我正在 Django 中运行这样的系统。

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

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

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

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

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

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


Sam*_*zzo 1

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

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

为“online_update”创建一个方法,与例程相同,相反。

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

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

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

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