新手问题 需求变更导致的数据库变动,应当如何做才能无缝迁移?

palytoxin · 2014年05月08日 · 最后由 agilejzl 回复于 2014年05月08日 · 2588 次阅读

是这样的,之前的设计不能满足新的要求,一个数据库表中的数据要被拆成两部分通过某些条件。有其他的相互关联表。 这种情况下一般的思路是什么,有事例可以借鉴学习么? 现在完全没有思路 先谢过大家

只要是 ActiveRecord 或者 raw SQL 可以表达的就可以操作,当然一般来说也肯定是。

然后你把这个变动加到 migration 里面就行了。

Rubber Duck Problem Solving http://blog.codinghorror.com/rubber-duck-problem-solving/

找一只橡皮小鸭,向它描述 清楚 你的问题,然后你就会知道怎么做了。

写一段 migration,包含需求的内容,然后执行它。

#1 楼 @billy 感谢~因为扯到的表很多,有的我自己都不是很了解,没有文档。

其实也想听一些做过此类事情的前辈,是如何确保数据完整迁移,需要注意什么,用的方法是写程序脚本还是纯 sql 语句? 第一次计划这种事情,有点力不从心底气不足:)

#2 楼 @Rei 好想法,棒!改天去找只鸭子 XD

#3 楼 @kgen migration~好像有点明白了,既可以按对象操纵表,还方便引用关联关系,又可以写 sql,谢谢建议~

正常应该 ActiveRecord 就足够了。

类似这样

class MoveFooToBar < ActiveRecord::Migration
  def up
     create_table :bars do |t|
       t.blahblah
     end
     # 这个很重要! 一定要reset
     Bar.reset_column_infomation
     # 然后该干嘛干嘛
     # 用create! 或者 save! 报错就可以回滚
     Foo.find_each do |foo|
       Bar.create! get_required_attributes_from_foo(foo)
     end
     # 然后最好先不要删除foos table
     # 等以后跑稳定了再加多一个migration就好了
  end

  def down
     drop_table :bars
  end
end   

#7 楼 @billy 然后我只需要 rake db:migrate:up VERSION=xxx ? 0.0

一直以为手动写的脚本还得自己写 establish_connection 啥啥的 那么写个 rake 任务应当也可以了?

@palytoxin 你只需要rails g migration MoveFooToBar, 然后修改,然后rake db:migrate就可以了。写其他的 rake 任务也可以,不过就和这个数据库的变化脱节了,得手动执行。

这种情况 mongodb 更容易解决,我们的流程是这样的

  1. 保留旧的字段,加上新的字段,如果涉及到数据迁移,则编写兼容代码,添加修改的时候再写入旧字段的同时也写入新字段 2.上线模型,并且在后台对老数据做数据迁移 3.上线新功能 4.删除兼容代码,清理废弃代码

把变更后的数据库设计好,然后按表的操作写 migration,migrate 之后查看 schema.rb 就能看到效果。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号