0

我正在使用 Deployer 将我的 Symfony 应用程序部署到生产环境。一切正常,但是,我的 deploy.php 文件包含用于数据库迁移的命令:

/**
* Run a diff to generate migrations, 
*/
task('database:diff', function () {

run('{{bin/php}} {{release_path}}/' . trim(get('bin_dir'), '/') . '/console doctrine:migrations:diff --env={{env}} --no-debug --no-interaction');

})->desc('Generate migrations database');

...

after('deploy:symlink','database:diff');
after('database:diff','database:migrate');

但是,如果数据库没有更改,则此步骤会导致错误。

错误信息:

[RuntimeException]                                                                                                                                                                                      

[Doctrine\DBAL\Migrations\MigrationException]                                                                                                                                                         
Could not find any migrations to execute.

我正在寻找一些可以检查任何数据库更改并且仅在有更改时有条件地运行迁移任务的代码。

4

1 回答 1

4

嗯,这是自动化迁移和数据库版本控制的奇怪方法。

我们就是这样做的:

每个开发人员都会生成他们的迁移;

  1. 在您的实体中添加/删除字段(或创建一个新实体)
  2. 运行$ php app/console doctrine:migrations:diff 迁移是在本地创建的。
  3. 然后,开发人员打开该迁移以确保一切正常,或者添加他们额外的迁移查询/迁移等。
  4. 然后他们提交/推送该迁移到存储库,以便所有迁移都由 git 版本控制。
  5. 如有必要,其他开发人员会提取这些迁移并在其本地计算机上运行它们。

在部署期间,不需要运行 diff,因为所有 diff 都在 git 存储库中,所以您只需运行database:migrate将您的 prod 数据库更新到最新版本。

提示:生成迁移时,最好为每个实体/数据库表生成一个迁移,因为如果在您的大迁移中某些 sql 查询会失败,那么很难回滚已经执行的这些查询。

于 2017-01-27T08:05:52.533 回答