一个命令行/API工具,用于跟踪数据库中表的历史,它是否存在,或者我应该去开发一个



我目前正在做一个项目,我需要做数据库同步。我们在服务器上有一个主数据库,并在其上有一个web应用程序与数据进行交互。但是由于这些数据是地理数据(复杂的多边形和一些点),所以用户在处理多边形时使用本地数据库(我们使用QGIS),然后将更改上传到服务器上会更方便、更高效。但是,当用户在本地工作时,可能会在服务器中修改某些点(仅可能与服务器上的点进行交互)。这就是为什么我需要同步数据库的能力。

拥有本地数据库和服务器数据库上的INSERT, UPDATE和DELETE的历史记录应该足以重建点的历史并进行同步。

顺便说一下,我们使用Spatialite作为本地数据库,PostGIS作为服务器主数据库

我找到了一堆关于如何在数据库上使用触发器来做到这一点的资源:

http://database-programmer.blogspot.com/2008/07/history-tables.html

如何存储历史数据

但是我找不到任何工具或库来做到这一点,而不必手动编写触发器。根据我的需要,我完全可以手动完成,但我觉得使用专用的命令行/API工具也可以使它变得更容易、更方便。例如,该工具将为用户想要跟踪历史记录的表生成历史表和触发器,我们还可以想象不同的选项,例如:

  • 我们想要跟踪哪些列?
  • 我们只想跟踪动作,还是也想跟踪值?

那么,总结一下,我的问题是:

  • 是否有任何现有的工具做这个?
  • 你认为实施这样一个工具是可行的/相关的吗?我想在Python中做(因为我的项目是django驱动的),启用不同的后端(现在我需要SQLite/Spatialite和PostgreSQL/PostGIS)…

谢谢你的回答,

暗'

GeoGig赤。GeoGig可以跟踪和同步来自各种来源的地理数据,即Postgis, Esri shapefile和spatialite。它实现了典型的Git工作流,但是基于数据。您将在服务器上拥有一个数据存储库,可以从本地工作站克隆、拉取和推送。

GeoGit是一个年轻的项目,仍处于测试阶段,但功能强大,功能丰富,能够合并不同的提交,创建差异,切换分支,跟踪历史记录和所有其他典型的Git任务。

一个典型的GeoGig工作流示例:

Geogig有一个舒适的命令行界面:

# on  http://server, initialize and start the remote repository on port 8182 (defaut)
geogig init
geogig serve
# on local, clone the remore repository to your machine
geogig clone http://server:8182 your_repository
cd your_repository/
# on local, import in geogig the data you are working on (Postgis)
geogig pg import --schema public --database your_database --user your_user --password your_pass --table  your_table
# on local, add the local changes
geogig add
# on local, commit your changes
geogig commit -m "First commit"
# on local, push to the remote repository
geogig push

您可以要求bucardo完成多主同步方面的繁重工作。看看https://bucardo.org/wiki/Bucardo他们承诺甚至可以在不同类型的数据库之间进行同步。Postgresql <-> sqlite, http://blog.endpoint.com/2015/08/bucardo-postgres-replication-pgbench.html

我不确定特殊的地理空间功能(仅同步区域)。

Geogig绝对值得一试。您可以将Geogig存储库直接插入GeoServer以服务WMS并通过Web/WFS编辑功能。

正如Wander所暗示的那样,这并不像"拥有INSERT、UPDATE和DELETE的历史记录"并保持它们同步那么简单。这里面有很多东西。有很多用于复制/镜像的DBMS工具。下面是PostreSQL的一个例子:pgpool.

感谢Wander Nauta和David G的回答,我完全同意这样一个事实,即执行同步通常并不像这样简单。我应该给出更多的细节,但就我的情况而言,我认为这已经足够了,因为:

  • 本地数据始终是服务器数据的一个子集,每个用户被分配一个子集。所以总是只有一个人在一个给定的子集上离线工作。
  • 在服务器端,用户只能修改/删除自己创建的数据。

为了提供更多关于环境的信息,每个用户都在本地将一个地区的航空图像数字化。每个用户被分配到一个地区进行数字化,并能够在服务器上上传他的工作。在服务器端,通过webapp,用户可以咨询大家的工作,发布问题点和评论,主要是指出对数字化的疑问或遗漏。我想要的是用户能够下载他们正在工作的区域的副本,其中包含他们的同事添加的点,在本地解决问题,删除点,最终添加新的疑问并再次上传。

在本地数据库和服务器数据库之间没有真正的主/从关系,每个数据库都有一个特定的角色。正因为如此,我不确定复制/镜像将满足我的需求,但也许我错了?此外,我希望避免使用过于复杂的解决方案来满足需求,并避免添加太多新的依赖项,因为需求不会发生太大变化。

相关内容

最新更新