php - Doctrine 迁移是否可用于生产应用程序?

标签 php zend-framework doctrine-orm rails-migrations

作为previously discussed ,我们正在围绕 Zend Framework 开发一个 PHP 应用程序,它需要在开发阶段以跨数据库的方式非常频繁地升级它的数据库。

我们目前正在为此使用 Rails 迁移,尽管它们是在 Ruby 中(而 Windows 上的 Ruby 是一团糟),我们很难将迁移分发给安装了基于 Windows 的客户。即使在 Linux 上,使用 Ruby 访问 MS SQL 和 Oracle 数据库也很痛苦。

我们想用 Doctrine 替换 Rails Migrations,但感觉它们很不成熟。文档不多,跟踪器中有一些错误会引发有关项目状态的危险信号,例如:

查看代码,这两个实际上删除原始表或列并在不保留数据的情况下重新创建它。这完全破坏了交易,让我认为没有人真正使用 Doctrine Migrations。

此外,我在文档中读到迁移使用顺序编号(版本 1、版本 2 等)使它们完全不适合分支开发,但是 DoctrineMigrationsBundle Symfony documentation使用确实有意义的基于日期的版本。

有没有人有使用该工具的实际经验,或者知道它的开发状态?

最佳答案

我们更多地研究了 Doctrine Migrations 并对其内部工作原理有了一些了解(并更新了 OP 中链接的错误)。

主要问题是 Doctrine 对迁移有根本不同的方法。它从您的数据库架构中构建一个抽象模型,然后允许您修改该模型。这些修改对底层数据库没有影响,但 Doctrine 使用它们来推断必须对数据库进行的实际更改。

这就像数据库的差异。这会产生一些非常恶劣的后果。例如,如果您重命名数据库中的列,则对模型的操作如下所示:

public function renameColumn($oldColumnName, $newColumnName)
{
    $column = $this->getColumn($oldColumnName);
    $this->dropColumn($oldColumnName);

    $column->_setName($newColumnName);
    return $this;
}

如果你使用这个函数然后让 Doctrine 应用迁移,它会查看新旧模式之间的差异(缺失的列、添加的列以及它们的类型)并推断是否需要重命名现有列或删除旧列并创建新列。这意味着 Doctrine 认为重命名列与删除它并重新创建它实际上是一样的,因此对此非常愚蠢。

  • 如果您重命名单个列而不更改任何其他内容,它将在 DBMS 上发出“重命名”命令。
  • 如果您重命名列并更改其类型(例如,varchar(80) 为 varchar(100)),它将删除并重新创建。
  • 如果您重命名 2 列并且不做任何更改,它会 panic 并删除它们并重新创建它们(diff 算法是最基本的)

我认为这是一种糟糕的数据库迁移方法,因为它不能可靠地工作。这种工具的全部意义在于跨迁移保存数据,而这不符合基本要求。

这就是说,无论如何我们都在使用它,因为没有更好的了。我们在不可靠的操作中添加了故意的失败消息,以避免让开发人员陷入许多陷阱。

关于php - Doctrine 迁移是否可用于生产应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9946585/

相关文章:

php - 使用 Subversion 制作 PHP 项目的生产版本

php - 如何在 zend 框架 View 中使用 $this->_()?

mysql - 跟进查询,不包括已收集的结果

php - 使用FOSElastica bundle 一次搜索多种类型

php - php数组循环值和键

php - 重新加载 .env 变量而不重新启动服务器(Laravel 5,共享主机)

PHP POST 到 URL,用户被重定向

php - 如何禁用 Zend_Form_Element_Radio 中的个别选项

php - 哪个先发生 : init or preDispatch?

symfony - 更新我的架构时出现 Doctrine 异常 "Data too long for column"