【问题标题】:Will my Rails schema changes wipe out data?我的 Rails 架构更改会清除数据吗?
【发布时间】:2023-04-09 02:19:01
【问题描述】:

我怀疑这是个奇怪的问题。我将在下面立即解释问题,然后为感兴趣的人提供解释我如何到达这里的背景

问题:

由于迁移,我的架构处于这样一种状态,它将我标记为删除和添加了相同的列。换句话说,当我 diff schema.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"

令人担忧的是,虽然这不会净添加/删除列,但如果我将此代码推送到生产环境并运行迁移,它基本上会清除现有数据,即使它没有删除净列中的任何列。

是这样吗?有谁知道数据库是否会从字面上删除然后添加四列,或者意识到没有任何变化?如果它会删除它们,任何人都可以想办法解决这个问题并保存数据以在删除之前重新插入吗?我不介意数据擦除和替换之间的延迟时间。

我是怎么到这里的:

基本上,我在本地进行了一大堆更改,涉及许多迁移,然后才意识到我已经删除了一些列,我需要将所有我想要的数据迁移到新表,因为我很仓促,并且一个白痴。

幸运的是,这只是在本地。不幸的是,我只是做了一个 git reset HEAD^ 来扔掉我的工作,但是即使迁移消失了,架构仍然顽固地处于迁移后的状态,并且无法重置或其他任何东西。所以我经历了尝试恢复旧迁移并将它们回滚的整个过程,半成功,然后编写其他迁移以完全回滚我半回滚的更改。

一团糟,结果就是这一个问题。毕竟这不是问题,我可以轻松部署/睡觉吗?

【问题讨论】:

  • 添加的 (+) 和删除的 (-) 部分是相同的,只是顺序不同。因此,只要您不对表中列的顺序做出任何假设,就可以了。

标签: ruby-on-rails ruby-on-rails-3 git activerecord migration


【解决方案1】:

所以这里有两个不同的问题 - 迁移和架构。如果您运行删除列的迁移,那么列将被删除,它们包含的任何数据也将被删除。因此,您可能想要编辑您的迁移并删除或编辑删除您要保留的列的任何迁移。要非常非常小心,任何迁移都不会删除您想要保留的数据。

schema.rb 基本上与您的生产数据库无关,除非您使用 rake 任务 (rake db:schema:load) 显式加载架构。这会清除您的数据,但作为一般规则,您不会对生产系统执行此操作。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    相关资源
    最近更新 更多