新手问题 数据迁移的问题

wdrsam · 2015年10月23日 · 最后由 huobazi 回复于 2015年10月23日 · 1949 次阅读

比如我 clone 了一个 a 项目,a 项目的 mysql 数据库里的数据是通过 sql 文件导入的。所以我拉下来没法运行,因为我本地没有对应的表。那么解决办法我想到了 2 个。

:重建一个 migration 任务,把里面需要对应到 mysql 数据库里表的每个字段都加上。但这里有个问题,我如果执行 rake db:migrate,它肯定会报错说字段已经有了。那么我就把 migration 任务里的 def change 改为 def down,虽然 down 是用来做回滚的,但它好像也有强制执行的功能。可以把表强行迁移了。

1.在这里,通过 migration 处理这个问题的正确办法是什么?我知道我把 change 改为 down 很不好,毕竟 down 方法不是为了这个而存在的。

:我可以直接在 schema_migrations 表里插入对应的 migration 文件下的所有任务清单的文件名(以时间戳命名的)。这样就可以让 rails 认为迁移任务是已经完成了的。只要数据表和 model 对应,就可以跑起来。

2.在这里,如果我有 3 个迁移任务文件,2015.rb 2014.rb 2013.rb,我必须按顺序将 2013 2014 2015 插入表内?如果是,那到底该把最新时间戳最后插入,还是最先插入?

怎么听起来像是要补 migration。rails 是按照文件名顺序构建 migration 的,migration 执行的时候,rails 会检查 schema_migrations 表最后一次执行到哪个文件了。 方法一,就是写 migration 的时候,change 里面不要放已经存在的列。除非你自己读取 Model 的列属性,自己判断,是否要新增这些列。

你可以尝试也通过 sql 文件导入的形式在本地新建一个数据库,然后运行:

rake db:schema:dump

帮助你生成 schema.rb 文件

直接 db:create db:migrate,再导 sql 就行了。 如果导入删掉了 schema_migrations 表 ,migrate 完备份一下这个表,再导 sql。

[因为我本地没有对应的表]-----[它肯定会报错说字段已经有了]

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