问题:
我的架构处于迁移的状态,它标记我已删除并添加了相同的列。换句话说,我在diff diff.rb:
时得到了这个- t.integer "cut_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "animal_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "animal_id"
+ t.integer "cut_id"
值得关注的是,虽然这不是net add / remove列,但如果我将此代码推送到生产并运行迁移,它将基本上消除现有数据,即使它不删除net中的任何列。
是这样的吗?有谁知道数据库是否会逐字删除然后添加四列,或者意识到没有变化?如果它将删除它们,任何人都可以想到一种方法来解决这个问题并保存数据以便在删除之前重新插入吗?我不介意在删除数据和替换数据之间存在滞后时间。
我如何在这里:
基本上,我在本地进行了一大堆更改,涉及大量迁移,然后才意识到我已经删除了一些我需要将所有数据迁移到新表所需的列,因为我很仓促,一个白痴。
幸运的是,这只是在当地。不幸的是,我只是做了一个git重置HEAD ^来抛弃我的工作,但即使迁移已经消失,架构仍然坚持在错误迁移后的状态,并且无法重置或任何东西。所以我经历了整个过程,尝试恢复旧的迁移并将其回滚,半成功,然后编写其他迁移以完全回滚我半回滚的更改。
巨大的混乱,只有这一个问题的结果。毕竟,任何机会都不是问题,我可以轻松部署/睡觉吗?
答案 0 :(得分:1)
因此,这里有两个不同的问题 - 迁移和架构。如果您运行删除列的迁移,则将删除列,以及它们包含的任何数据。因此,您可能希望编辑迁移并删除或编辑删除要保留的列的任何迁移。非常非常小心,任何迁移都不会删除您想要保留的数据。
schema.rb与生产数据库基本无关,除非您使用rake任务显式加载模式(rake db:schema:load)。这会消灭你的数据,但这不是你对生产系统做的一般规则。