作家
登录

如何从MongoDB迁移到MySQL?这有现成经验!

作者: 来源: 2017-10-20 11:05:20 阅读 我要评论

  •  
  • “_id” : ObjectId(“4d3ed089fb60ab534684b7e9”), 
  •  
  • “tag_ids” : [ 
  •  
  • ObjectId(“4d3ed089fb60ab534684b7f2”), 
  •  
  • ObjectId(“4d3ed089fb60ab53468831f1”) 
  •  
  • ], 
  •  
  • “title”: “xxx”, 
  •  
  • “content”: “xxx” 
  •  
  •  
  • 而 ActiveRecord 中会建立一张零丁的表,表的名称是两张表名按照字母表次序的拼接,如不雅是 Post 和 Tag,对应的多对多表就是 posts_tags,除了创建多对多表,has_and_belongs_to_many 还会创建两个 ActiveRecord::Base的子类 Tag::HABTM_Posts 和 Post::HABTM_Tags,我们可以应用下面的代码简单实验一下:

    我们欲望大年夜 MongoDB 迁徙到 MySQL 的另一个重要原因就是 MongoDB 每一个文档的主键实袈溱是太过冗长,一个 32 字节的 _id 无法给我们供给特别多的信息,只能增长我们的浏览障碍,再加上项目中并没有安排 MongoDB 集群,所以没能享受到用默认的 UUID 生成机制带来的好处。

    上述代码打印出了两个 has_and_belongs_to_many 生成的类 Tag::HABTM_Posts 和 Post::HABTM_Tags,它们有着完全雷同的表 posts_tags,处理多对多关系瓯,我们只须要在应用 DatabaseTransformer 导入表中的所有的数据之后,再经由过程遍历 posts_tags 表中的数据更新多对多的关系表就可以了:

    1. class PostsTag < ActiveRecord::Base; end 
    2.  
    3. # migrate data from mongodb to mysql. 
    4.  
    5. transformer = DatabaseTransformer.new ‘draven_production’ 
    6.  
    7. transformer.import :posts_tags 
    8.  
    9. # establish association between posts and tags. 
    10.  
    11. PostsTag.unscoped.all.each do |model| 
    12.  
    13. post = Post.find_by_uuid model.post_uuid 
    14.  
    15. tag = Tag.find_by_uuid model.tag_uuid 
    16.  
    17. next unless post.present? && tag.present? 
    18.  
    19. model.update_columns post_id: post.id, tag_id: tag.id 
    20.  
    21. end  

    所有应用 has_and_belongs_to_many 的多对多关系都须要经由过程上述代码进行迁徙,这一步须要在删除数据库中的所有 uuid 字段之前完成。

    1. # app/models/post.rb 
    2.  
    3. class Post < ActiveRecord::Base 
    4.  
    5. validate_presence_of :title, :content 
    6.  
    7. end 
    8.  
    9. # db/migrate/20170908075625_create_posts.rb 
    10.  
    11. class CreatePosts < ActiveRecord::Migration[5.1] 
    12.  
    13. def change 
    14.  
    15. create_table :posts do |t| 
    16.  
    17. t.string :title, nullfalse 
    18.  
    19. t.text :content, null

        推荐阅读

        如何选择硬盘:SSD硬盘vsHDD硬盘

      总之,HDD硬盘和SSD硬盘各有本身的市场。而兼具SSD硬盘和HDD硬盘的机能和特点的mSATASSD设备和混淆驱动器是花费者寻求分砂茨?的更浩揭捉?择。 沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的>>>详细阅读


      本文标题:如何从MongoDB迁移到MySQL?这有现成经验!

      地址:http://www.17bianji.com/lsqh/38066.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)