我今天制作了一个新的 Rails 3 应用程序,添加了一个简单的迁移,但由于某种原因,当我执行 rake db:migrate 时没有任何反应。它只是暂停几秒钟,然后返回命令提示符,没有任何错误或任何东西。Schema.rb 和数据库保持为空。
任何想法可能会发生什么?我做了很多应用程序,从来没有遇到过这个问题。一切都是完全标准的设置。
我今天制作了一个新的 Rails 3 应用程序,添加了一个简单的迁移,但由于某种原因,当我执行 rake db:migrate 时没有任何反应。它只是暂停几秒钟,然后返回命令提示符,没有任何错误或任何东西。Schema.rb 和数据库保持为空。
任何想法可能会发生什么?我做了很多应用程序,从来没有遇到过这个问题。一切都是完全标准的设置。
您的迁移无法运行有几个原因,但最常见的是系统已经认为您定义的所有迁移都已经运行。
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
如果您在迁移过程中出现错误,您将看到控制台上列出的异常。由于迁移已自动回滚,您应该能够一次又一次地运行它,直到正确为止。
我遇到了同样的问题。我做了一种对我有帮助的简短技巧。我发布它以防万一有人想要一个简短而甜蜜的解决方案。我同意塔德曼所说的
“系统已经认为您定义的所有迁移都已运行”
我所做的是更改/app_folder/db/migrate文件夹中的迁移文件的名称。我认为 ruby 迁移文件名称中的数字部分是创建文件的时间。
每次要重新运行迁移时,您都可以在文件名中添加 1 。更改名称后删除/删除表(我使用 mysql 命令行工具进行删除),然后运行rake db:migrate并且应该完成迁移。
打电话spring stop
可能会解决你的问题。
好吧,我发现是什么导致了我的问题。我正在使用 slim_scooge gem 并将其注释掉使一切正常进行。虽然不知道为什么...
我今天在使用 Redmine 迁移插件时遇到了类似的问题
rake redmine:plugins:migrate RAILS_ENV=production NAME=plugin_name
其中 plugin_name 实际上是插件的 init.rb 中定义的插件名称。
折腾了4个小时,终于发现我的插件目录名和插件名不一样(注意redmine_
前缀):
~/redmine/plugins/redmine_plugin_name
因此,请确保您的插件放置在以插件名称命名的文件夹中。我相信它也适用于其他 Rails 应用程序。