除此之外,我们也须要处理一些复杂的模型关系,比如 Mongoid 中的 inverse_of 在 ActiveRecord 中叫做foreign_key 等等,这些修改其实都并不复杂,只是如不雅想要将这部分的代码全部处理掉落,就须要对营业逻辑进行具体地测试以包管不会有遗留的问题,这也就对我们项目标测试覆盖率有着比较高的请求了,不过我信赖绝大年夜多半的 Rails 工程都有着异常好的测试覆盖率,可以或许包管这一部分代码和逻辑可以或许顺利迁徙,然则如不雅项目中完全没有测试或者测试覆盖率很低,就只能人肉进行测试或者自求多福了,或者就别做迁徙了,多写点测试再推敲这些重构的工作吧。
为每一个模型创建对应的迁徙文件并建表其实一个不得不做的体力活,固然有一些工作我们没法省略,然则我们可以推敲应用主动化的方法为所有的模型添加 uuid 字段和索引,同时也为类似 post_id 的字段添加响应的 post_uuid 列:
- class AddUuidColumns < ActiveRecord::Migration[5.1]
- def change
- Rails.application.eager_load!
- ActiveRecord::Base.descendants.map do |klass|
- # add `uuid` column and create unique index on `uuid`.
- add_column klass.table_name, :uuid, :string, unique: true
- add_index klass.table_name, unique: true
- # add `xxx_uuid` columns, ex: `post_uuid`, `comment_uuid` and etc.
- uuids = klass.attribute_names
- .select { |attr| attr.include? ‘_id’ }
- .map { |attr| attr.gsub ‘_id’, ‘_uuid’ }
- next unless uuids.present?
- uuids.each do |uuid|
- add_column klass.table_name, uuid, :string
- end
- end
- end
- end
将所有的数据全部插入到 MySQL 的表之后,模型之间还没有任何显式的关系,我们还须要精晓过 uuid 连接的模型转换成应用 id 的方法,对象之间的关系才能经由过程点语法直接拜访,关系的建立其实异常简单,我们获合适前类所有结尾为 _uuid 的属性,然后遍历所有的数据行,根据 uuid 的值和 post_uuid 属性中的 “post” 部分获取到表名,最终获得对应的接洽关系模型,在这里我们也处理了类似多态的间谍作况:
在添加 uuid 列并建立好索引之后,我们就可以开端对数据库进行迁徙了,如不雅我们决定在迁徙的过程中改变原稀有据的主键,那么我们会将迁徙分成两个步调,数据的迁徙和关系的重建,前者仅指将 MongoDB 中的所稀有据全部迁徙到 MySQL 中对应的表中,并将所有的 _id 转换成 uuid、xx_id 转换成 xx_uuid,而后者就是前面提到的:经由过程 uuid 和 xx_uuid 的接洽关系从新建立模型之间的关系并在最后删除所有的 uuid 字段。
我们可以应用如下的代码对数据进行迁徙,这段代码大年夜 MongoDB 中遍历某个集合 Collection 中的全部数据,然后将文档作为参数传入 block,然后再分别经由过程 DatabaseTransformer#delete_obsolete_columns 和 DatabaseTransformer#update_rename_columns 办法删除部分已有的列、更新一些数据列最后将所有的 id 列都变成 uuid:
推荐阅读
总之,HDD硬盘和SSD硬盘各有本身的市场。而兼具SSD硬盘和HDD硬盘的机能和特点的mSATASSD设备和混淆驱动器是花费者寻求分砂茨?的更浩揭捉?择。 沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的>>>详细阅读
本文标题:如何从MongoDB迁移到MySQL?这有现成经验!
地址:http://www.17bianji.com/lsqh/38066.html
1/2 1