【发布时间】:2011-02-05 12:38:31
【问题描述】:
我正在尝试提出(或找到)一个可重用的系统,用于 php 项目中的数据库模式版本控制。
有许多 Rails 风格的迁移项目可用于 php。 http://code.google.com/p/mysql-php-migrations/ 就是一个很好的例子。它为迁移文件使用时间戳,这有助于解决分支之间的冲突。
这种系统的一般问题: 当开发分支 A 被签出,而您想要签出分支 B 时, B 可能有新的迁移文件。这很好,迁移到更新的内容很简单。
如果分支 A 有更新的迁移文件,您需要向下迁移到最近的共享补丁。如果分支 A 和 B 具有显着不同的代码库,您可能需要进一步向下迁移。这可能意味着:签出 B,确定共享补丁号,签出 A,向下迁移到此补丁。这必须从 A 完成,因为实际应用的补丁在 B 中不可用。然后,检查分支 B,并迁移到最新的 B 补丁。从 B 到 A 再逆过程。
建议的系统: 向上迁移时,不只是存储补丁版本,而是将整个补丁序列化到数据库中以备后用,尽管我可能只需要 down() 方法。 更改分支时,将已运行的补丁与目标分支中可用的补丁进行比较。通过 ID 或哈希确定运行补丁的 db 表和目标分支中的补丁之间最近的共享补丁(或可能是最旧的差异)。还可以查找隐藏在两个分支之间的多个共享补丁下的新补丁或缺失补丁。
使用 db 表存储的 down() 方法自动向下合并到最近的共享补丁,然后向上合并到分支的最新补丁。
我的问题是: 这个系统是否太疯狂和/或充满后果而无法开发?我在数据库模式版本控制方面的经验仅限于 PHP 自动补丁,这是一个仅 up() 的系统,需要具有顺序 ID 的文件名。
2 年后更新
这是一篇旧帖子,但我想提一下,我在开发过程中通常放弃了迁移,因为它们不必要地复杂且容易出错。
相反,我使用构建脚本来:
- 清空数据库,
- 创建架构,
- 添加已知的应用程序数据(真实内容),并且
- 添加夹具数据(开发内容)。
当更改分支或接收来自其他开发人员的更新时,您可以使用一个命令完全重新加载数据库以达到已知状态。
生产服务器仍然需要数据库补丁,但无论如何都必须手动创建。
【问题讨论】:
-
对此投反对票:“我在开发过程中通常放弃了迁移,因为它们不必要地复杂且容易出错。” - 我完全不能同意这种说法。如果有一件事情我可以避免多年来我所看到的所有技术进步,那就是数据库迁移。 YMMV。
标签: php database version-control schema migration