【问题标题】:doctrine:generate-migrations-diff does not generate any new migration学说:generate-migrations-diff 不会产生任何新的迁移
【发布时间】:2013-06-14 13:41:41
【问题描述】:

今天我在我的 schema.yml 中进行了一些更改后,每个更改后跟 diff、migrate、build 命令,diff 操作停止工作。

最后一次成功的迁移是第 243 次。

现在,我所做的每一个新更改,当我发出 diff 命令时,结果总是一样的:

/usr/bin/php /.../symfony --color doctrine:generate-migrations-diff
>> doctrine  generating migration diff
>> file+     /tmp/doctrine_schema_92228.yml
Done.

lib/migration/doctrine 中没有创建新文件,所以我无法使用 migrate 命令将更改提交到 db。

我尝试清除缓存、清理模型文件、构建所有类并重新启动。

有什么想法吗?

【问题讨论】:

  • 在运行 diff 之前,您是否使用新模式生成了类?如果是这样,请回滚您的架构,重新生成您的类,重新应用您的架构更改并重新运行差异。
  • 感谢您的建议;不,我总是按这个顺序 diff-migrate-build;现在我将尝试在完全备份后从模型重建架构 ;-)
  • 更新:我从 db 重建 schema.yml;然后我尝试了构建模型,但现在我收到了这个警告:/usr/bin/php /.../symfony --color doctrine:build-model >> doctrine generating model classes >> file+ /tmp/doctrine_schema_93565.yml PHP Notice: Undefined index: alias in /.../lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Import/Builder.php on line 685 我很困惑......
  • 哇,清除缓存? (我不知道你为什么会收到这个错误)
  • 目前我有类似的问题 - diff 命令不会生成任何其他文件。我只是放弃了寻找解决方案并开始手动编写我的迁移类。通常我对数据库的更改并不那么重要,因此编写起来相对容易:)

标签: symfony1 doctrine migration symfony-1.4


【解决方案1】:

这是我遇到的每次迁移和成功的最佳方式。花了我很多时间去猜测,但可以完美地工作并且可以与多个数据库一起使用。我在某些句子中可能是错误的,因此请随时在您看到的任何内容中添加或更正我。

迁移,最安全的方式:)

如果您需要为多个数据库迁移应用这些补丁并清除 symfony 缓存,它们可以完美运行:
doctrine_core.r7687
doctrine_manager.r7657

A.备份项目和数据库:

  1. 保存 Symfony 项目文件。 (可选但安全的方式)。
  2. 仅保存数据库表架构。
  3. 仅保存数据库表数据。
  4. 用数据保存数据库表架构。

B.如何更改 .yml 文件:

  1. .yml 文件不能包含奇怪的符号,例如 ñ´```.. . 或非 UTF 字符..

  2. 在 Notepad++ 或 Sublime 中始终显示空格和制表符。不能有标签!!

  3. 您不能有两个同名的模块,即使在不同的数据库中也是如此。永远不要设置两个同名的模块,否则你会遇到很多问题。

  4. 如果您想使用多个数据库,则必须在 schema.yml 文件的开头指定 connection 属性:

    connection: doctrine_master
    
  5. 使用多个数据库,您必须再次为具有正确连接的模块设置绑定connection

    Tbtest001:
      connection: doctrine_master
      tableName: tb_test001
    
  6. 在 schema.yml 中设置正确的变量值和类型: Schema Files Variables, models and types

  7. 使用多个数据库,每次只为一个数据库注意和修改一个 schema.yml!

  8. 如果您要添加一个与另一个表有关系的新表,建议分两步进行,两次迁移。首先只添加表并迁移。然后添加关系并再次迁移。这是最安全的方式。

  9. 你可以在不同的地方有不同的 schemas.yml。

C.迁移更改:

  1. 安装此插件,因为它具有检查更改的修复和改进: idlDoctrineMigrationPlugin

  2. 为您的项目的每个数据库创建一个新表。插件工作所需:

    name: migration_version , column: version  (int (11)). (autoincrement=false).
    
  3. 在版本列中,将其值设置为您现在拥有的最新迁移版本。您必须对拥有表 migration_version 的每个数据库执行此步骤:

    UPDATE databasetest.migration_version SET databasetest.migration_version.version='31';
    UPDATE databasetest2.migration_version SET databasetest2.migration_version.version='31';
    
  4. 清除 Symfony 缓存:

    symfony cc
    
  5. 使迁移有所不同(您需要上面的插件和创建的版本表)

    symfony model:diff > migratediff.log
    
  6. 检查以下文件中最新生成的更改是否正确:

    .\lib\migration\doctrine\XXXXXX_versionXXX.php
    .\data\migration\history\XXXXXXXXXX.yml
    
  7. 通过指定一个数字继续migration UP!,永远不要进行迁移!。还要记住新参数--connection。如果您应用了上述补丁,它现在可以工作,并且它只会迁移正确的数据库:

    symfony doctrine:migrate 32 --connection=doctrine_master > migrateUP.log
    
  8. 重建模型、表单、过滤器、删除旧模型..

    symfony doctrine:build-model
    symfony doctrine:build-forms
    symfony doctrine:build-filters
    symfony doctrine:clean-model-files
    symfony cc
    
  9. 将所有数据库设置为其表migration_version中的最新迁移号:

    UPDATE databasetest.migration_version SET databasetest.migration_version.version='32';
    UPDATE databasetest2.migration_version SET databasetest2.migration_version.version='32';
    
  10. 可选步骤,如果您想知道迁移后发送到数据库的最新 SQL 查询:

    symfony doctrine:build-sql [--application[="..."]] [--env="..."]
    

D.链接和文件:

Correct way to do a migrations diff
Doctrine migrations fallback
http://trac.symfony-project.org/ticket/7272
http://trac.symfony-project.org/ticket/7689
http://trac.symfony-project.org/ticket/8604
http://php-opensource-help.blogspot.com/2010/07/how-to-get-connection-from-doctrine-to.html
http://www.doctrine-project.org/documentation/manual/1_1/en/connections
http://forum.symfony-project.org/viewtopic.php?t=29361&p=104098

迁移涉及的主要文件:
Migration.php、Builder.php、sfTaskMigration.php

【讨论】:

  • 哇,我一有时间就去试试;同时,我发现在我的机器上运行 migrations-diff 会使 php5 crash 8-|
  • 该插件在某些系统中可能无法正常工作,因此您需要找出崩溃的原因并修复代码。在 Windows 7、php 5.4、symfony 1.14.17 中为我工作。迁移的方法可能还有很多,即使插件不适合你,你仍然可以使用原始命令进行迁移并按照后续步骤操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多