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:in
primary_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:in
move_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:in
remove_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
然后您可以 运行 另一次迁移以添加新列。您当然可以在重新创建数据库之前将它们添加到现有迁移中。希望对您有所帮助。
我尝试 "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:in
primary_key' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:538:incopy_table' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:533:in
move_table' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:526:inblock 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:inalter_table' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:467:in
remove_column' /var/lib/gems/1.9.1/gems/activerecord-4.2.0/lib/active_record/migration.rb:662:inblock 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:insay_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:inblock 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:inrevert' /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:inblock (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:inwith_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:inmigrate' /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:inblock 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:inwithin_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:intransaction' /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:inexecute_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:ineach' /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:indown' /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:inmigrate' /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
然后您可以 运行 另一次迁移以添加新列。您当然可以在重新创建数据库之前将它们添加到现有迁移中。希望对您有所帮助。