mongoose换成mysql_如何将MongoDB数据库的数据迁移到MySQL数据库中

FAQ v2.0终于上线了,断断续续忙了有2个多月。这个项目是我实践的第一个全栈的项目,从需求(后期有产品经理介入)到架构,再到设计(有征询设计师的意见)、构建(前端、后台、数据库、服务器部署),也是第一次独立负责一个项目,所以意义很不一般,后面还会写一篇总结的文章。闲言少叙,进入正题:

其中有一个自动定时发访问记录列表和反馈问题列表的邮件的功能,本来打算自己写的,不过后来了解到团队有现成的平台可以做这个事,所以就用现成的喽。但有一个问题,该平台配置的数据源必须是MySQL数据库,而FAQ平台用的是MongoDB数据库。有两个办法:一是把现有的MongoDB数据库换成MySQL,这样的话要改动比较大;二是把MongoDB里的数据迁移到MySQL数据库。我采用的是第二种方法,可是怎么迁移呢?不能直接迁移,在网上搜了下,有一个办法是先把MongoDB里的数据导出到csv文件或者txt文件中,再把csv/txt文件中的数据导入到MySQL数据库中,感觉挺靠谱的。

分两步走:

cacbc974ea1d4f77295d57de541fff08.png

PS:昨天用windows自带的画图工具画的那个图有点丑,今天一个设计师朋友用sketch给我画了个好看点的图,附上。(2016.10.26更新)

第一步:将MongoDB里的数据导出到csv文件,有一个mongo自带的工具mongoexport就可以实现。

/usr/local/mongodb/bin/mongoexport -h ip(192.168.0.102) -u mongo数据库登录帐号 -p mongo数据库登录密码 -d mongo数据库名称 -c mongo数据库集合名 -f _id,字段1,字段2 --type=csv -o 保存路径(/data/kagol/records.csv)

导出的csv文件格式是一条mongo记录占一行,字段之间用逗号(,)分割。

第二步:将csv文件导入到MySQL数据库中,可以用MySQL的load命令。

SQL语句如下(load_csv_data.sql):

1 load data local infile '/data/kagol/records.csv'

2 into table `records` character setutf8

3 fields terminated by ',' optionally enclosed by '"'

4 lines terminated by '\n'

5 ignore 1 lines;

写成shell脚本(load_csv_data.sh):

mysql -hip(192.168.0.105) -umysql登录用户名 -pmysql登录密码 mysql数据库名 --default-character-set=utf8 --local-infile=1 < /data/kagol/load_csv_data.sql

要注意的是:

(1)-h和ip之间不需要空格(-u,-p同理);

(2)MySQL数据库的格式必须和csv格式一致(字段数、顺序等)。

这样就顺利地完成了MongoDB数据库到MySQL数据库的迁移,but!!这个方法导出来的数据中文是乱码的!!花了那么多时间居然是乱码,此刻我的内心是奔溃的!(此处不配图,自己脑补画面)

于是,有了现在的方案,写代码(Node)迁移。

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 //mongo对象

2 var Record = require('./record');

3

4 //mysql对象

5 var mysql = require('mysql');

6 var connection =mysql.createConnection({

7 host : '192.168.0.104',//mysql服务器ip

8 user : 'XXX',//mysql登录名

9 password : 'XXX',//mysql登录密码

10 database : 'XXX'//mysql数据库名

11 });

12

13 connection.query('set names latin1');//这句很关键,确保中文不乱码

14

15 var addZero = function(num){

16 return num < 10 ? '0' +num : num;

17 }

18

19 var getYesterday = function(){

20 var now = newDate();

21 var year =now.getFullYear();

22 var month = now.getMonth() + 1;

23 now.setTime(now.getTime() - 1000*60*60*24);

24 var day =now.getDate();

25 var result = year + '-' + addZero(month) + '-' +addZero(day);

26 returnresult;

27 }

28

29 var yesterday =getYesterday();

30

31 //导入昨天的数据

32 Record.find({time:{'$gt':yesterday + ' 00:00:00','$lt':yesterday + ' 23:59:59'}},function(err, docs){

33 if(err){

34 console.log('error');

35 }else{

36 for(var i=0;i

37 var 字段1 =docs[i].字段1;

38 var 字段2 =docs[i].字段2;

39 var sql = 'insert into faq_records (字段1, 字段2) values("'+字段1+'","'+字段2+');';

40 connection.query(sql, function(err, rows) {

41 return;

42 });

43 }

44 console.log('succeed!');

45 }

46 })

48304ba5e6f9fe08f3fa1abda7d326ab.png

record.js文件是封装了对mongo数据库的操作:

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 var mongoose = require('mongoose');

2 var connectionRecord = mongoose.createConnection('mongodb://mongo登录帐号:mongo登录密码@ip:mongo服务端口(默认是27017)/数据库名');

3 var Schema =mongoose.Schema;

4 var recordSchema = newSchema({

5 字段1: String,

6 字段2: String

7 });

8 var Record = connectionRecord.model('Record', recordSchema);

9 module.exports = Record;

48304ba5e6f9fe08f3fa1abda7d326ab.png

这个方案完美地解决了中文乱码问题!

大家有别的方法可以一起讨论哈~~

PS:一直没搞明白为什么第一种方案会乱码,mongo里的数据确实是没有乱码的,csv文件里的数据也没有乱码,就是到了MySQL里就是乱码,怀疑是load data那一步有问题,但是我加了"character set utf8"和"--default-character-set=utf8"啊~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java虚拟机——JVM

JVM&#xff1a;java虚拟机&#xff0c;简称JVM&#xff0c;是运行所有java程序的假想计算机&#xff0c;是java程序的运行环境&#xff0c;是java最具吸引力的特征之一。我们编写的java代码&#xff0c;都运行在JVM之上。 跨平台&#xff1a;任何软件的运行&#xff0c;都必须…

mysql 5.0.37.tar.gz_Linux下MySQL5.0.37安装配置步骤

Linux下安装MySQL5.0.37需要以下面三个包:MySQL-client-community-5.0.37-0.rhel3.i386.rpmMySQL-server-community-5.0.37-0.rhel3.i386.rpmperl-DBI-1.53-2.fc7.i386.rpm(以下步骤需要root权限)1.验证是否已经安装过MySQLrpm -qa|grep MySQL如果发现有安装过,并需要卸载,使用…

JRE和JDK

JRE&#xff1a;是java程序的运行时环境&#xff0c;包含JVM和运行时所需要的核心类库。 JDK&#xff1a;时java程序开发工具包&#xff0c;包含JRE和开发人员使用的工具。 我们想要运行一个已有的java程序&#xff0c;那么只需要安装JRE即可。 我们想要开发一个全新的java程序…

java程序开发步骤

java程序开发步骤 开发环境搭建完毕后&#xff0c;可以开发第一个程序了 java程序开发三个步骤&#xff1a;编写&#xff0c;编译&#xff0c;运行。

thinkphp三级分销小程序源码_山东谷道微信小程序商城源码带后台 公众号平台三级分销系统...

山东谷道微信小程序商城源码带后台 公众号平台三级分销系统那么微信二级分销系统与微信三级分销系统到底有什么区别和联系呢?为什么改了个数字地位就天差地别?1、微信分销模式等级的区别用简洁的话来说&#xff0c;微信的三级分销系统包含了微信的二级分销系统&#xff0c;只…

linux mysql timestamp_MySQL时间类型Timestamp和Datetime 的深入理解

MySQL数据库常用的时间类型有timestamp和datetime&#xff0c;两者主要区别是占用存储空间长度不一致、可存储的时间也有限制&#xff0c;但针对不同版本下&#xff0c;timestamp字段类型的设置需要慎重&#xff0c;因为不注意的可能会被“坑死”。一、TIMESTAMP和DATETIME字段…

sql express 无法启动服务_在Windows2012下安装SQL Server 2005无法启动服务的解决办法...

因为安装了Windows2012操作系统&#xff0c;的确很不错&#xff0c;唯一的遗憾就是不支持Sql Server 2005的安装。找了很多办法&#xff0c;基本上都有缺陷。现在终于找到一种完全正常没有缺陷的办法了&#xff0c;和大家分享一下。1、正常安装任一版本的SQL Server 2005.2、安…

ecs php mysql集成环境_在阿里云 CentOS 服务器(ECS)上搭建 nginx + mysql + php-fpm 环境...

阿里云的云服务器(ECS)可以选择多种操作系统&#xff0c;打算用它运行 Drupal或者 WordPress &#xff0c;你最好选择 Linux 系统&#xff0c;这篇文章的演示是基于阿里云的 CentOS 操作系统的服务器。我们在上面搭建一个 nginx mysql php-fpm 的环境&#xff0c;这就是常说的…

python处理文件夹_python文件及文件夹操作

1.open()各模式详情r 以只读模式打开&#xff0c;没有write()方法&#xff0c;默认打开方式w 以只写模式打开&#xff0c;文件不存在时会自动创建文件&#xff0c;文件已存在时会清除文件内容并重建文件。这种模式打开的文件没有read()方法。a 以追加模式打…

svn中项目管理中ec_Mac中使用svn进行项目管理

Mac中使用svn进行项目管理,借鉴了http://blog.csdn.net/q199109106q/article/details/8655204以下方案多人亲测可用转载请注明出处&#xff1a;http://blog.csdn.net/yc7369在Windows环境中&#xff0c;我们一般使用TortoiseSVN来搭建svn环境。在Mac环境下&#xff0c;由于Mac自…

10067mysql_MYSQL数据库mysql Non-Transactional Database Only(只支持MyISAM)

《MYSQL数据库mysql Non-Transactional Database Only(只支持MyISAM)》要点&#xff1a;本文介绍了MYSQL数据库mysql Non-Transactional Database Only(只支持MyISAM)&#xff0c;希望对您有用。如果有疑问&#xff0c;可以联系我们。MYSQL入门后来在做WordPress,一开始还不知道…

java类的定义的实例_《Java基础知识》Java类的定义及其实例化

类必须先定义才能使用。类是创建对象的模板,创建对象也叫类的实例化。下面通过一个简单的例子来理解Java中类的定义:public classDog {String name;intage;void bark()//汪汪叫{System.out.println("汪汪&#xff0c;不要过来");}voidhungry(){System.out.println(&q…

excel mysql插件_智分析Excel插件

智分析Excel插件官方版是一款好用的自助分析云平台&#xff0c;智分析Excel插件官方版是一款面向业务用户的EXCEL插件工具&#xff0c;智分析Excel插件官方版支持各类云端数据库、本地excel数据导入功能&#xff0c;软件能够将本地数据和线上数据结合起来分析。软件可以帮助办公…

【计算机网络】——习题解析:一个UDP用户数据的数据字段为8192字节,在数据链路层要使用以太网来传输,试问应当划分为几个IP数据报片?说明每一个IP数据报字段长度和片偏移字段的值

【计算机网络】——习题解析&#xff1a;一个UDP用户数据的数据字段为8192字节&#xff0c;在数据链路层要使用以太网来传输&#xff0c;试问应当划分为几个IP数据报片&#xff1f;说明每一个IP数据报字段长度和片偏移字段的值 答&#xff1a;6个数据字段的长度&#xff1a;前5…

网络协议,各层功能,各层协议

一、OSI七层模型 OSI七层协议模型主要是&#xff1a;应用层&#xff08;Application&#xff09;、表示层&#xff08;Presentation&#xff09;、会话层&#xff08;Session&#xff09;、传输层&#xff08;Transport&#xff09;、网络层&#xff08;Network&#xff09;、数…

fastdfs java token_fastdfs-client-java操作fastdfs

一、在https://github.com/happyfish100/fastdfs-client-java 下载客户端&#xff0c;解压后并执行ant命令&#xff0c;在E:\tools\libs\fastdfs\fastdfs-client-Java-master\src\build下会生成fastdfs_client.jar如图示二、mvn安装fastdfs_client.jar&#xff0c;在cmd中执行命…

idea编辑器中使用@Data注解无效解决办法

使用Data注解可以减少了以前的get和set等方法&#xff0c;但是在idea编辑器中不认识会在使用实体类元素时候找不到&#xff08;但是运行不会报错&#xff09; 所以可以添加插件

@Mapper和@Repository的区别

Mapper和Repository的区别 1.相同点 Mapper和Repository都是作用在dao层接口&#xff0c;使得其生成代理对象bean&#xff0c;交给spring 容器管理 对于mybatis来说&#xff0c;都可以不用写mapper.xml文件 2.不同点 Mapper不需要配置扫描地址&#xff0c;可以单独使用&#x…

git本地库(操作具体命令)

在任何盘符下创建本地仓库repository&#xff08;除git目录下&#xff09; 在项目目录创建新的本地仓库&#xff0c;并把项目里的所有文件全部添加、提交到本地仓库中去&#xff1a; $ git init #在当前的目录下创建一个新的空的本地仓库 Initialized empty Git repository…

idea右键项目没有git 【解决方法】

右键项目&#xff0c;没有git选项 解决方法&#xff1a; 进入settings,然后搜索version,按下图点击即可&#xff1a; over&#xff0c;解决&#xff1a;