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

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

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

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

编辑:

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

肯定有更好的办法。

更新:

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

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

sqlite是git友好的吗?

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

Edit2:

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


当前回答

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

其他回答

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

采用一个数据库转储,并对其进行版本控制。这样它就是一个平面文本文件。

我个人建议同时保留一个数据转储和一个模式转储。通过使用diff,可以相当容易地看到从一个修订到另一个修订的模式中发生了哪些变化。

如果您正在进行大的更改,那么您应该有一个用于进行新模式更改的辅助数据库,而不会触及旧数据库,因为正如您所说的,您正在进行一个分支。

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

$pg_dump --schema ... 

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

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

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

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

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

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

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

我已经发布了一个sqlite工具,它可以满足您的要求。它使用一个自定义的差异驱动程序,利用sqlite项目工具'sqldiff', uuid作为主键,并去掉sqlite rowid。它仍然处于alpha阶段,所以反馈是非常感谢的。

Postgres和mysql比较棘手,因为二进制数据保存在多个文件中,即使您能够对其进行快照,也可能无效。

https://github.com/cannadayr/git-sqlite

这个问题基本上已经回答了,但我想用一个小建议来补充X-Istence和Dana the Sane的回答。

如果您需要具有一定粒度的修订控制,比如每天,那么您可以使用rdiff-backup之类的工具将表和模式的文本转储与增量备份结合起来。这样做的好处是,不存储每日备份的快照,而只存储与前一天的差异。

这样你就有了修订控制的优势,也不会浪费太多的空间。

在任何情况下,直接在频繁更改的大平面文件上使用git都不是一个好的解决方案。如果数据库变得太大,git在管理文件时会出现一些问题。