【问题标题】:How to execute migration current version using "Symfony doctrine migrations" without any interaction?如何在没有任何交互的情况下使用“Symfony 学说迁移”执行迁移当前版本?
【发布时间】:2020-01-29 14:31:06
【问题描述】:

正如教义迁移帮助所说:

Or you can also execute the migration without a warning message which you need to interact with:

      ./bin/console doctrine:migrations:migrate --no-interaction

我尝试通过命令运行当前迁移版本:

./bin/console doctrine:migrations:migrate current --no-interaction  

尽管如此,我总是得到一个错误:

WARNING! You have 1 previously executed migrations in the database that are not registered migrations.
    >> 2020-01-29 13:03:03 (20200129130303)
No migrations to execute.

当然,我清楚地理解“我之前执行过 1 次迁移”。 我的目标是在没有任何交互的情况下执行特定的旧版本。我怎样才能实现它?

【问题讨论】:

  • migration_versions 表中有一条记录20200129130303 - 您之前已经进行过迁移并删除了文件,但没有删除数据库记录。删除它以使警告消失。一旦迁移类被从本地机器上推开,就不要再玩迁移类了;)
  • It is my goal to execute a specific old version without any interaction. 不过,除非您有脚本(用于部署、cronjob 等)设置,否则这是不可能的。命令为bin/console doctrine:migrations:execute 1234567890 -n --up(或--down),将数字替换为类名的日期时间戳。
  • @rkeet 我想通过 ansible 在我的部署过程中使用这个命令。这个想法是在迁移目录中运行最后一个迁移版本。当我结帐到具体的 git 标签或分支并希望根据迁移文件夹设置我的数据库时,它会很方便。
  • 对,在这种情况下,您只需运行bin/console doctrine:migrations:migrate -n,您已经完成了。该命令获取所有可用的 Migration 类文件,检查编号(在类名中)与 migration_versions 中的记录,并执行数据库中 not 的所有类。因此,如果您在签出指定的 git 提交(或最新的“开发”或“主”等)后执行该命令(使用 Ansible),那么它会执行所有可用以创建“最新可用”(在提交的限制内) )。

标签: symfony doctrine


【解决方案1】:

这不是错误,这只是警告。由于@rkeet 在评论中提到的原因而显示它。该命令仍然在没有交互的情况下执行。

如果您不想看到任何输出,则应使用--quiet, -q 标志。

交互是 Symfony 询问您Are you sure you want to execute migrations?(或任何消息),而您回答yn。这部分用--no-interaction 标志省略。

【讨论】:

  • 正如你提到的,Symfony 询问我Are you sure you wish to continue? (y/n)?。当我使用--no-interaction 标志时,这部分被省略了。并且没有执行迁移命令!所以,我认为这不是好的行为。在我看来,当我添加标志 --no-interaction 时,必须完全没有交互,并且必须迁移我的迁移。但就我而言,什么都没有发生。
  • 是的,因为,正如您所提到的:No migrations to execute. 这意味着所有迁移都已执行。
  • 好的,我明白你的意思了 :) 但是如果我的目录的版本低于 migrations_versions 表中的版本,是否有可能降级我的数据库版本?
  • 是的,有,但这确实是另一个问题。要再次回答您的原始问题,doctrine:migration:migrate 命令(带有任何参数)后跟-q-n 标志将导致命令在没有交互且没有输出的情况下运行。
  • But is there any possibility downgrade my database version if my directory has version less then in migrations_versions table? @RomanAndreev 不 - 不是你陈述问题的方式。你这样说:“如果我通过检查早期版本来恢复一堆提交,我可以将数据库恢复到那个状态吗?”,答案是“不”。您必须(手动!)首先恢复数据库。当您签出 (git) 早期版本时,您还使用向下脚本删除了 Migration 类(因此:“您有 1 个先前在数据库中执行的迁移 [..]”
猜你喜欢
  • 2011-03-27
  • 1970-01-01
  • 2016-12-17
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 2019-12-28
相关资源
最近更新 更多