2012-03-30 79 views
14

作为previously discussed,我们正在开发一个围绕Zend Framework的PHP应用程序,当我们在开发阶段进行移动时,需要对数据库进行相当频繁的升级并以跨数据库的方式进行升级。原则迁移是否可用于生产应用程序?

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

我们希望用Doctrine's代替Rails Migrations,但他们觉得很不成熟。没有太多的文档和存在的一些跟踪该错误提高对项目的状态红旗,如:

看代码,这两个实际上下降原始表或列,并重新创建它,而不保留数据。这是一个完全的交易断路器,让我觉得没有人真正使用Doctrine Migrations。

此外,我认为迁移使用顺序编号(第1版,第2版等),使它们完全不适合枝发展的文件中读出,但随后DoctrineMigrationsBundle Symfony documentation使用基于日期的版本的有意义。

有没有人有该工具的真实世界的经验,或知道它的发展状态?

+0

老实说,我很惊讶缺乏这个工具。我想持续的开发/发布并不像我想的那么大。 – GomoX 2012-04-03 20:51:33

回答

7

说实话,主义迁移比大多数的产品更好;然而,它们有点不成熟,很难找到文件。这就是说,如果保持在有限的范围内,他们工作得很好。

此外,使用任何迁移工具,您只需要小心,不要期望它提供魔法。这就是说,没有一个跨平台的工具是功能完整的,并且在野外被证明是liquibase。此外,我不知道其他工具包括数据库文档工具。

上liquibase下面说说应为您提供足够的信息,让你开始:

http://slidedecks.wilmoore.com/2012-confoo/painless-version-controlled-database-refactoring

+0

感谢您的概述,我现在知道它的大部分内容,但一年前会发现它非常有用:)这说,Liquibase只是数据库迁移,而在Ruby中使用独立迁移,我可以在我的数据操作迁移也是如此。具有Migrations的AR界面允许我以非常简单的方式执行此操作。另一方面,Liquibase中的XML描述不提供任何支持。我错过了什么? – GomoX 2012-04-03 02:18:30

+0

如果通过“数据操作”,您的意思是插入,更新,删除数据,当然,您可以使用Liquibase完成所有操作。 – 2012-04-03 06:13:50

+0

但它必须是静态数据。我无法计算出另一个新列的值,或者类似的东西,对吗?我需要某种脚本。 – GomoX 2012-04-03 11:49:23

2

如果你正在寻找学说2,那么它可能会有点不成熟,特别是如果你'只想使用Migrations库。从我作为一个独立库的经验来看,它不是Doctrine2 ORM的一部分,它不是一个可靠的产品。值得称赞的是,它仍然是Alpha,作为完整ORM的Doctrine是一个非常好的库(迁移作为其一部分工作得很好)。

我已经在许多生产环境中使用Doctrine 1.X作为完整的ORM和迁移,并且它工作得很好。

+0

但是Doctrine 1.x不再被维护,而Doctrine 2似乎是标准版本。我什至不能找到如何使用Doctrine 1的例子,并没有被维护它似乎并不是一个好主意。 – GomoX 2012-04-03 02:19:37

14

我们查看了更多关于Doctrine Migrations的内容,并对其内部工作进行了一些了解(并更新了OP中链接的错误)。

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

这就像数据库的差异。这有一些非常不好的后果。例如,如果您在模型上的DB重命名列的操作是这样的:

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

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

如果您使用此功能,然后有学说应用的迁移,它会再看看老之间的差异新的模式(缺失的列,添加的列和其类型),并推断是否需要重命名现有列或删除旧列并创建新列。这意味着Doctrine认为重命名专栏实际上与删除专栏并重新创建专栏相同,因此非常愚蠢。

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

我认为这是一个糟糕的数据库迁移方法,因为它不能可靠地工作。在迁移过程中,这不符合基本要求

这就是说,我们正在使用它,因为没有什么更好的了。 e不可靠操作中的失败消息,以避免让开发人员陷入许多陷阱。

+0

您是否建议Doctrine在丢弃并重新创建列时丢失数据?因为那肯定会使它在生产环境中无法使用? – Prathap 2013-10-02 18:12:29

+0

确实。您需要谨慎行事,以避免因行为不当而导致数据丢失。 – GomoX 2013-10-10 14:55:08

+0

现在已经3年了,你还在使用Doctrine提供的迁移,还是改成了别的东西? – JCM 2015-10-30 18:30:26

相关问题