Ruby rails 耙回滚不够远

Ruby rails rake not rolling back far enough

我尝试 "rake db:rollback STEP=6" 或更多,但是当我 运行 "rake db:migrate" 它只显示正在执行的最后一个迁移文件:

== 20150508040222 CreateStructure: migrating ================================== == 20150508040222 CreateStructure: migrated (0.0000s) =========================

当我尝试使用 "rails console" 和 "puts User.new().inspect" 检查是否在上一步中创建了新字段时,它显示这些字段仍然缺失。

我如何回滚以便它执行我编辑的那些交易文件?

[编辑]

当我尝试使用 "rake db:migrate VERSION=20150328013052" 回滚时,它在倒数第二次迁移时失败,因为它无法删除不存在的字段。我想我修改了迁移以在迁移已经执行后添加这些字段,所以这些字段不存在。我应该怎么办?我尝试在 schema.rb 和 运行ning migrate 中修改时间戳,但看起来这不是跟踪当前版本的原因。

class AddLoginToUsers < ActiveRecord::Migration
  def change
    add_column :name, :password, :string
  end
end

== 20150508040222 CreateStructure: reverting ================================== == 20150508040222 CreateStructure: reverted (0.0273s) =========================

== 20150506210153 AddLoginToUsers: reverting ================================== -- remove_column(:name, :password, :string) rake aborted! StandardError: An error has occurred, this and all later migrations canceled:

Could not find table 'name'/var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:517:in table_structure' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:431:inprimary_key' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:538:in copy_table' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:533:inmove_table' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:526:in block in alter_table' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract/database_statements.rb:211:in transaction' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:525:in alter_table' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:467:inremove_column' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:662:in block in method_missing' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:632:in block in say_with_time' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:632:in say_with_time' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:652:in method_missing' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:497:in block in revert' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:496:in each' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:496:in revert' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:604:in exec_migration' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:590:in block (2 levels) in migrate' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:589:in block in migrate' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:292:in with_connection' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:588:in migrate' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:765:in migrate' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:995:in block in execute_migration_in_transaction' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:1041:in block in ddl_transaction' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in block in transaction' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract/transaction.rb:188:in within_new_transaction' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in transaction' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/transactions.rb:220:in transaction' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:1041:in ddl_transaction' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:994:in execute_migration_in_transaction' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:956:in block in migrate' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:952:in each' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:952:in migrate' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:827:in down' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:802:in migrate' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/tasks/database_tasks.rb:137:in migrate' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/railties/databases.rake:44:in block (2 levels) in ' Tasks: TOP => db:migrate (See full trace by running task with --trace)

[编辑]

好的,我明白了,我只需要清空迁移以撤销它们,然后重写它们。问题已解决。

我会通过打开 schema.rb 文件(位于 db/schema.rb)找到架构的当前状态,第一行看起来像:

ActiveRecord::Schema.define(version: 20150507210038) do

将该版本号与 db/migrate 文件夹中的迁移匹配。也许您已经在进行适当的迁移。要返回迁移,我建议:

rake db:migrate VERSION=20080906120000

其中版本号与迁移文件名上的版本相对应。

[更新]

错误在这里:

class AddLoginToUsers < ActiveRecord::Migration
  def change
   add_column :name, :password, :string
  end
end

add_column有以下要求:

add_column :table, :column_name, :column_type

确保 table 是复数形式。检查您的 Schema.rb 文件以查看 table。由于这是用户 table,也许您的意思是:

add_column :users, :password, :string

如果您遇到架构问题,您可以完全转储数据库并重新创建它。我会编辑适当的迁移(删除导致问题的迁移),然后通过 运行ning:

转储并重新创建数据库
rake db:drop db:create db:migrate

然后您可以 运行 另一次迁移以添加新列。您当然可以在重新创建数据库之前将它们添加到现有迁移中。希望对您有所帮助。