46

我正在编写我的第一个 Rails 应用程序。我已经运行了一些命令rails generate model ...rake db:migrate但我现在想更改我的数据模型,因此需要撤消一些迁移。

文档说我可以使用撤消迁移rake db:rollback,但这不起作用。当我在控制台中运行它时,计算机会思考几秒钟,但不会对db/migrate/or进行任何更改db/migrate/schema.rb。没有输出打印到控制台。

这种行为正确吗?不db:rollback应该改变我的架构吗?如果是这样,谁能想到为什么它可能不起作用?

我在 Rails v. 3.2.6 上。

编辑

此刻rake db:migrate:status

database: db/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20120617191211  Create irs
   up     20120701154357  Create paths
   up     20120701154421  Create nodes
   up     20120702151447  ********** NO FILE **********
  down    20120702155140  Create venues
  down    20120703233833  Remove path from venues
4

4 回答 4

72

解决方案(见我的评论):运行

rake db:migrate:status

并纠正您在那里发现的问题。在这种情况下(根据@MarkThomas 的跟进),您可能需要检查您需要的所有文件是否都已到位。

于 2012-07-04T00:13:37.507 回答
11

这对我有用。结合这个答案中给出的步骤和分贝的评论。

  1. rake db:migrate:status
  2. 如果您有****NO FILE****条目,只需将版本号记为 noFileVersion。注意没有文件条目(stable_version)上方的条目版本。
  3. 创建了一个带有 namenoFileVersion_create_nothing.rb和 body的“虚拟”文件
class CreateNothing < ActiveRecord::Migration[6.0] 
  def change 
  end 
end
  1. rake db:migrate VERSION=stable_version
  2. noFileVersion_create_nothing.rb手动删除。
  3. 运行rake db:migrate
  4. 再次运行rake db:migrate:status以检查 No file entry 是否消失。
于 2017-07-13T07:09:44.563 回答
6

以下对我有用: rake db:migrate:down VERSION=20190304092208

版本号可以通过以下命令获取: rake db:migrate:status

这是回滚最后一次迁移的最后一个版本号

于 2019-03-04T09:37:49.663 回答
1

注意:谨慎使用这些建议,这对于非开发环境非常危险。


如果

rake db:migrate:status

给你一个迁移,说

up 20120702151447 ********** NO FILE **********

那么最好的办法就是做一个(注意以下命令将删除数据库):

rake db:reset

重做所有迁移。如果最后一个迁移是缺失的,那么schema.rb将有最后一个迁移,rake db:migrate它将寻找:

ActiveRecord::Schema.define(:version => 20120702151447) do

将该编号更改​​为 migrate 文件夹中的最后一个编号。

于 2013-06-27T23:40:36.840 回答