我正在做一个web应用程序,我需要为一些主要的更改做一个分支,事情是,这些更改需要更改数据库模式,所以我想把整个数据库放在git下。

我怎么做呢?是否有一个特定的文件夹,我可以保存在git存储库下?我怎么知道是哪个?我如何确定我放入了正确的文件夹?

我需要确定,因为这些更改是不向后兼容的;我可不能搞砸。

在我的例子中,数据库是PostgreSQL

编辑:

有人建议进行备份并将备份文件置于版本控制之下,而不是将数据库置于版本控制之下。说实话,我觉得这真的很难接受。

肯定有更好的办法。

更新:

好吧,没有更好的方法了,但我还是不太相信,所以我要稍微改变一下问题:

我想将整个数据库置于版本控制之下,我可以使用什么数据库引擎来将实际数据库置于版本控制之下,而不是转储?

sqlite是git友好的吗?

因为这只是开发环境,所以我可以选择任何我想要的数据库。

Edit2:

我真正想要的不是跟踪我的开发历史,而是能够从我的“新的根本性变化”分支切换到“当前稳定的分支”,并且能够用当前稳定的分支修复一些错误/问题等。这样,当我切换分支时,数据库就会自动地与我当前所在的分支兼容。 我不太关心实际数据。


当前回答

我想把整个数据库置于版本控制之下 我可以使用数据库引擎,这样我就可以把实际的数据库 版本控制而不是它的转储?

这与数据库引擎无关。在Microsoft SQL Server上有很多版本控制程序。我不认为git可以解决这个问题,你必须使用pgsql特定的模式版本控制系统。我不知道这样的事情是否存在……

其他回答

我希望它能简单一些。检入模式作为文本文件是捕获DB结构的良好开端。然而,对于内容,我还没有找到比CSV文件更干净、更好的git方法。一张桌子一个。然后,DB可以在多个分支上编辑,并非常好地合并。

在git版本控制下存储每个级别的数据库更改就像每次提交时推送整个数据库,每次拉取时恢复整个数据库。 如果您的数据库很容易发生重大更改,并且您无法承担丢失它们的代价,那么您可以更新pre_commit和post_merge钩子。 我对我的一个项目也做了同样的事情,你可以在这里找到方向。

我认为X-Istence在正确的轨道上,但你可以对这一策略进行更多的改进。首先,使用:

$pg_dump --schema ... 

转储表、序列等,并将此文件置于版本控制之下。您将使用它来分离分支之间的兼容性更改。

接下来,对一组表执行数据转储,这些表包含应用程序操作所需的配置(可能应该跳过用户数据等),比如表单默认值和其他不可修改的数据。你可以有选择地使用:

$pg_dump --table=.. <or> --exclude-table=..

这是一个好主意,因为当数据库达到100Mb以上时,在进行完整的数据转储时,回购会变得非常笨拙。更好的办法是备份你测试应用所需的最小数据集。如果你的默认数据非常大,这仍然可能导致问题。

如果您确实需要在回购中放置完全备份,请考虑在源代码树之外的分支中进行备份。不过,一个引用了匹配的svn rev的外部备份系统可能是最好的。

另外,我建议在修改时使用文本格式转储而不是二进制格式转储(至少对于模式而言),因为这些格式转储更容易区分。

最后,如果还没有查看postgres备份文档,请查看一下。你评论备份“数据库”而不是转储的方式让我怀疑你是否在考虑基于文件系统的备份(注意事项请参阅第23.2节)。

没有原子性就无法做到这一点,如果不使用pg_dump或快照文件系统,就无法获得原子性。

我的postgres实例在zfs上,我偶尔会对它进行快照。它几乎是即时和一致的。

Irmin (branching + time travel) Flur.ee (immutable + time travel + graph query) XTDB (formerly called 'CruxDB') (time travel + query) TerminusDB (immutable + branching + time travel + Graph Query!) DoltDB (branching + time-travel + SQL query) Quadrable (branching + remote state verification) EdgeDB (no real time travel, but migrations derived by the compiler after schema changes) Migra (diffing for Postgres schemas/data. Auto-generate migration scripts, auto-sync db state) ImmuDB (immutable + time-travel)