【问题标题】:Ruby rails rake not rolling back far enoughRuby rails rake 回滚不够远
【发布时间】:2015-08-03 21:44:16
【问题描述】:

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

== 20150508040222 CreateStructure: 迁移 ================================== == 20150508040222 CreateStructure:迁移(0.0000s)=========================

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

如何回滚以执行我编辑过的事务文件?

[编辑]

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

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

== 20150508040222 CreateStructure: 还原 ================================== == 20150508040222 CreateStructure:恢复(0.0273s)=========================

== 20150506210153 AddLoginToUsers: 还原 ================================== -- remove_column(:name, :password, :string) rake 中止! StandardError:发生错误,此迁移和所有后续迁移 取消:

找不到表 '名称'/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 迁移' /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 在 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 交易中的区块' /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 迁移' /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 个级别)在“任务:TOP => db:migrate(见 通过使用 --trace 运行任务来完整跟踪)

[编辑]

好的,我明白了,我只需要清除迁移来反转它们,然后重新编写它们。问题解决了。

【问题讨论】:

    标签: migration rake rollback


    【解决方案1】:

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

    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
    

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

    add_column :users, :password, :string
    

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

    rake db:drop db:create db:migrate
    

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

    【讨论】:

    • 我尝试使用 VERSION 回滚,我想我明白它为什么不起作用了。请检查上面。
    猜你喜欢
    • 1970-01-01
    • 2017-06-21
    • 2012-07-04
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2012-08-27
    • 1970-01-01
    相关资源
    最近更新 更多