保存提交中的数据库数据更改(如果不是sqlite)

时间:2008-12-15 01:33:29

标签: database version-control

我们有一个使用PostgreSQL特定查询的Rails项目,所以即使在开发模式下使用sqlite也很不舒服。问题是,我喜欢跟踪数据库中的模式更改并省略请求运行迁移,我也喜欢用git跟踪db-data更改,因此我不需要转储数据库并加载它在我的机器上。所以基本上我只想做'git pull'并看到应用程序使用新的架构和数据。

这里有什么可行的策略? 我唯一想到的是使用一个简单的包装器,它接受一个sql查询,检查它是否有任何特定于db的部分并重写它以用于开发环境,这样我们仍然可以使用sqlite。还有什么?

2 个答案:

答案 0 :(得分:2)

我不确定我理解你问题的所有细微差别 - 尤其是关于使用SQLite和PostgreSQL的评论。如果它是一个多DBMS系统,那么使用多个系统进行测试是好的;如果它是一个单一的DBMS系统,那么使用多个DBMS会让生活变得毫无意义。

另外,您谈到跟踪数据库中的架构更改...这是否与DBMS自己的系统目录分开存储架构更改的信息,或者您是否真的想要跟踪数据库架构更改(使用外部的东西)数据库 - 例如VCS)?

您还谈到跟踪“数据库数据更改”,我将其称为“数据库中表格中的数据”。同样,我不清楚你是否正在考虑从数据库中转储某种类型的数据,这些数据涵盖了前一天和之前的内容之间的差异,或其他内容。

这些问题可能是您在超过4小时内未收到回复的原因。

当你谈到一个“简单的包装”时,你并不是在谈论我称之为简单的东西。它必须解析任意SQL,确定它是否是特定于DBMS的,然后应用重写规则。这是一项不平凡的事业。获取在正确位置调用的包装器也可能非常重要 - 它取决于您用于访问DBMS的API集合等等。

还有什么?

  • 在生产和开发中使用相同的DBMS吗?
  • 跟踪架构更改并非易事。您需要跟踪模式的本质(例如表名,列名等),而不是意外(是的,我之前正在重读Brooks的“No Silver Bullet”),例如TabID(可能在没有模式的情况下变化)实质上是不同的)。但是,分析会告诉您架构是否不同。
  • 跟踪数据更改(与架构更改无关)也非常重要。通常,这种数据量很大。您可以处理完整存档或完全卸载或导出数据库 - 但确保每次都以相同的顺序显示数据可能需要您一些小心。如果您不能确保正确的排序,VCS将因订购差异而记录巨大的变化。

所有上述内容都等于可怕的“ it depends ”答案。这取决于:

  • 您的DBMS
  • 您的数据库大小
  • 架构的易变性
  • 数据的波动性

幸运的是,它仅略微取决于您的VCS或平台。

答案 1 :(得分:0)

如果我理解正确,您希望能够跟踪架构和数据更改。

事实上,这些是两件截然不同的事情 -

  • 架构更改 - 在其他几个问题(hereherehere)中对此进行了讨论。 从这些问题的答案中得出的主要结论是,您可以将模式转储到SQL文件并使用常规源代码控制(git,svn等)跟踪它们,也可以使用特定于数据库的SW(红门,dbmaestro) )。 但是,这不允许您在另一台服务器上完全重新创建数据库的相同副本。这让我 -
  • 数据更改 - 这更难,因为(就像@jonathan写的那样)很难跟踪数据库对其文件所做的更改。我建议你结帐OffScale DataGrove。 DataGrove跟踪对整个DB(结构+数据)的更改。您可以在任何时间点标记版本,并使用简单的命令返回到DB的旧状态。它还允许您创建同一数据库的虚拟,单独副本,以便每个团队成员可以拥有自己独立的数据库。所有虚拟副本都被跟踪到同一个存储库中,因此将数据库恢复到别人的版本(你称之为“git-pull”)非常容易。

免责声明 - 我在OffScale工作: - )