【问题标题】:Rails rake db:migrate has no effectRails rake db:migrate 没有效果
【发布时间】:2011-08-01 16:15:35
【问题描述】:

我今天创建了一个新的 Rails 3 应用程序,添加了一个简单的迁移,但由于某种原因,当我执行 rake db:migrate 时没有任何反应。它只是暂停几秒钟,然后返回命令提示符,没有任何错误或任何东西。 Schema.rb 和数据库保持为空。

任何想法可能会发生什么?我做了很多应用程序,从来没有遇到过这个问题。一切都是完全标准的设置。

【问题讨论】:

  • 你试过rake db:migrate --trace吗?输出是什么?你也试过rake db:rollback; rake db:migrate吗?
  • Jakub 的意思是它可能已经运行了。按照他的指示,至少应该向您表明您的迁移已正确运行。此外,您也可以在文件结构中搜索您的迁移。它将在 application_name/db/migrate 中。
  • rake db:migrate --trace 的输出是:** Invoke db:migrate (first_time) ** Invoke environment (first_time) ** Execute environment ** Execute db:migrate ** Invoke db :schema:dump (first_time) ** 调用环境 ** 执行 db:schema:dump 并回滚,然后 migrate 也不做任何事情。当我尝试使用显式版本迁移时,它说迁移不存在。但它肯定在标准位置,db/migrate。

标签: ruby-on-rails ruby-on-rails-3 activerecord rake rails-migrations


【解决方案1】:

致电spring stop 可能会解决您的问题。

【讨论】:

    【解决方案2】:

    我今天在使用 Redmine 迁移插件时遇到了类似的问题

    rake redmine:plugins:migrate RAILS_ENV=production NAME=plugin_name
    

    其中 plugin_name 实际上是插件的 init.rb 中定义的插件名称。

    苦苦挣扎了4个小时,终于发现我的插件目录名和插件名不一样(注意redmine_前缀):

    ~/redmine/plugins/redmine_plugin_name
    

    因此,请确保您的插件位于以插件名称命名的文件夹中。我相信它也适用于其他 Rails 应用程序。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。我做了一种对我有帮助的简短技巧。我发布它以防万一有人想要一个简短而甜蜜的解决方案。我同意塔德曼所说的

      "系统已经认为所有迁移 你定义的已经运行”

      我所做的是更改 /app_folder/db/migrate 文件夹中的迁移文件的名称。我认为 ruby​​ 迁移文件名称中的数字部分是创建文件的时间。

      您可以在每次要重新运行迁移时将 1 添加到文件名中。更改名称后删除/删除表(我使用 mysql 命令行工具进行删除)然后运行 ​​rake db:migrate 应该完成迁移。

      【讨论】:

      • 是的。当 --trace 没有显示错误时,这种解决方法是修复问题的唯一方法,但由于某些未知错误,它不会再回滚或迁移。也可以擦除整个表并从头开始运行,但先制作一个 db-copy,这样您就可以恢复所有数据。
      【解决方案4】:

      嗯,我发现了导致我的问题的原因。我正在使用 slim_scooge gem 并将其注释掉使一切正常进行。不知道为什么...

      【讨论】:

      • 也许您可以接受自己的答案,以便清楚地解决问题。谢谢。
      【解决方案5】:

      您的迁移无法运行有几个原因,但最常见的原因是系统已经认为您定义的所有迁移都已运行。

      每次迁移都会在schema_migrations 表中创建一个条目,其中version 列对应于标识符号。如果您想强制迁移重新运行,您通常可以将其退出并重试。例如,如果您有 20100421175455_create_things.rb,那么您将使用以下命令重新运行它:

      rake db:migrate:redo VERSION=20100421175455
      

      一种常见的情况是,您的迁移一开始就未能运行,例如它产生了一个异常,但 Rails 仍然认为它已完成。要强制重新运行迁移,请从schema_migrations 表中删除相应记录,然后再次运行rake db:migrate

      将来避免此类问题的一种方法是使用自动退出程序定义您的迁移:

      class CreateThings < ActiveRecord::Migration
        def self.up
          # ... (migration) ...
      
        rescue
          # If an exception occurs, back out of this migration, but ignore any
          # exceptions generated there. Do the best you can.
          self.down rescue nil
      
          # Re-raise this exception for diagnostic purposes.
          raise
        end
      end
      

      如果您在迁移过程中出现错误,您将看到控制台上列出的异常。由于迁移已自动回滚,您应该能够一次又一次地运行它,直到正确为止。

      【讨论】:

      • 这是不使用 MySQL 的原因之一;这些东西是由支持事务模式更改的数据库(如 postgres)自动处理的。
      • 我手动删除了我的表,然后尝试使用您的解决方案。任何人阅读本文,不要做我做的事。让 Rails 处理您的迁移。 ;-) 如果你像我一样做,只需创建一个简单的小表,Rails 可以在重做迁移时删除它。
      • 我要补充一点,您可以通过从schema_migrations 表中删除条目来明确告诉rails“没有发生迁移”。例如。 rails dbconsole 然后输入 DELETE FROM schema_migrations WHERE version='...';。小心这种方法,但它并不像听起来那么危险。
      • 另一种方法是将change 重命名为up(如果您使用的是change)并定义一个空的down 方法。然后运行rake db:migrate:down VERSION=20100421175455 将使Rails 忘记迁移。确保在完成后还原更改。
      猜你喜欢
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 2014-05-09
      • 1970-01-01
      相关资源
      最近更新 更多