如何回滚到以前的迁移并删除架构中的表和列?
Posted
技术标签:
【中文标题】如何回滚到以前的迁移并删除架构中的表和列?【英文标题】:How do I rollback to a previous migration and delete tables and columns in my schema? 【发布时间】:2019-07-17 11:50:38 【问题描述】:我正在处理一个 Rails 5 项目,我已经在我的一些表中添加了各种列并创建了一个新表。这显然创建了一些迁移文件,我想恢复到某个迁移并删除此迁移后对架构进行的所有更改。我该怎么做?
Schema.rb:
ActiveRecord::Schema.define(version: 20180814220216) do
create_table "stores", force: :cascade do |t|
t.string "name"
t.string "address"
t.float "beer_cost"
t.text "facilities"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.float "latitude"
t.float "longitude"
t.boolean "toilet"
t.string "address_line2"
t.string "address_line3"
t.integer "user_id"
t.integer "toilet_id"
t.string "toilet_available"
end
create_table "toilets", force: :cascade do |t|
t.string "toilet_available"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
end
运行后输出rails db:migrate:status
Status Migration ID Migration Name
--------------------------------------------------
up 20180610144440 Create stores
up 20180611145310 Change datatype beer cost
up 20180611150425 Delete cig cost column
up 20180611231832 Add longitude and latitude
up 20180612194032 Add toilets column
up 20180614125348 Add address line2 column
up 20180614133234 Add address line3 column
up 20180625201708 Devise create users
up 20180625235156 Add user id to stores
up 20180626124327 ********** NO FILE **********
up 20180626124742 ********** NO FILE **********
up 20180627115344 ********** NO FILE **********
up 20180627115710 ********** NO FILE **********
up 20180810102513 ********** NO FILE **********
up 20180811094301 ********** NO FILE **********
up 20180814220216 ********** NO FILE **********
【问题讨论】:
How to rollback a specific migration?的可能重复 【参考方案1】:您可以使用:
rails db:rollback STEP=<put the number of migrations you want to go back
但是迁移仍然存在,如果您运行 rails db:migrate
,您仍然会看到所有这些更改。
因此要么编写撤消先前迁移的新迁移,例如删除表。
或者手动删除不需要的迁移文件。
【讨论】:
我试过了,但列和表仍然显示在架构中 @Steve Schema 在你运行rails db:migrate
时被复制。所以你可以删除架构,然后使用正确的迁移运行rails db:migrate
我尝试删除所有我不想要的迁移文件和架构文件,然后运行rails db:migrate VERSION=20180625235156
生成的架构仍然有我不想要的所有列和表。跨度>
当我运行rails db:migrate:status
时,它会显示迁移,然后是NO FILE
我删除了迁移文件。
Schema 是由你的迁移生成的。再次检查它们。如果您不需要数据,您也可以再次删除并创建您的数据库。【参考方案2】:
您不应该删除迁移,一旦您删除它们,就无法回滚它们。正确的步骤顺序是rake db:rollback
,然后删除迁移文件。
此时最简单的解决方案是使用rails db
打开一个SQL终端,手动删除你不需要的列/表,然后rake db:schema:dump
更新你的schema.rb
。
【讨论】:
谢谢。我最终通过 rails 控制台删除了列和表。不过,当我运行rails db:migrate:status
时,我仍然收到所有****** NO FILE ******
消息。有没有办法摆脱它们?
删除schema_versions
表中对应的记录。以上是关于如何回滚到以前的迁移并删除架构中的表和列?的主要内容,如果未能解决你的问题,请参考以下文章
如何参数化 Postgres-custom-function 中的表和列,如果值存在则选择 PK,否则插入并返回 PK?
使用 mvn liquibase:diff 时如何禁用删除表和列?
如何防止 Entity Framework Core 2.0 重命名生成类中的表和列(数据库优先)