- module DatabaseTransformer
- def import(collection_name, *obsolete_columns, **rename_columns)
- collection = Mongoid::Clients.default.collections.select do |c|
- c.namespace == “#{database}.#{collection_name.to_s.pluralize}”
- end.first
- unless collection.present?
- STDOUT.puts “#{collection_name.to_s.yellow}: skipped”
- STDOUT.puts
- return
- end
- constant = collection_name.to_s.singularize.camelcase.constantize
- reset_callbacks constant
- DatabaseTransformer.profiling do
- collection_count = collection.find.count
- collection.find.each_with_index do |document, index|
- document = yield document if block_given?
- delete_obsolete_columns document, obsolete_columns
- update_rename_columns document, rename_columns
- update_id_columns document
- insert_record constant, document
- STDOUT.puts “#{index}/#{collection_count} ” if (index % 1000).zero?
- end
- end
- end
- end
当完成了对文档的各类操作之后,该办法会直接调用 DatabaseTransformer#insert_record 将数据插入 MySQL 对应的表中;我们可以直接应用如下的代码将某个 Collection 中的全部文档迁徙到 MySQL 中:
- transformer = DatabaseTransformer.new ‘draven_production’
- transformer.import :post, :_slugs, name: :title, _status: :status
上述代码会在迁徙时将集号绫强一个文档的 _slugs 字段全部忽视,同时将 name 重定名成 title、_status 重定名成 status,固然作为列举类型的字段 mongoid-enum 和 ActiveRecord 的列举类型完全不合,然则在这里可以直接插入也没有什愦问题,ActiveRecord 的模型在创建时会本身处理字符串和整数之间的转换:
- def insert_record(constant, params)
- model = constant.new params
- model.save! validate: false
- rescue Exception => exception
- STDERR.puts “Import Error: #{exception}”
推荐阅读
总之,HDD硬盘和SSD硬盘各有本身的市场。而兼具SSD硬盘和HDD硬盘的机能和特点的mSATASSD设备和混淆驱动器是花费者寻求分砂茨?的更浩揭捉?择。 沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的>>>详细阅读
本文标题:如何从MongoDB迁移到MySQL?这有现成经验!
地址:http://www.17bianji.com/lsqh/38066.html
1/2 1