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程序…

mysql index subquery_[慢查优化]慎用MySQL子查询,尤其是看到DEPENDENT SUBQUERY标记时

它的执行计划如下&#xff0c;请注意看关键词“DEPENDENT SUBQUERY”&#xff1a;id select_type table type possible_keys key key_len ref rows Extra------ ------------------ ------ ------------…

java程序开发步骤

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

mysql数据库rp集群_MySQL集群入门(PXC)

目标&#xff1a;1.掌握PXC集群MySQL方案的原理&#xff1b;2.掌握PXC集群的强一致性&#xff1b;3.掌握PXC集群的高可用方案&#xff1b;硬件要求&#xff1a;1.Win10x64企业版/linux/MacOS&#xff1b;2.Docker虚拟机&#xff1b;3.内存8GB以上&#xff1b;单节点数据库的弊端…

标识符、命名规则

标识符&#xff1a;是指在程序中&#xff0c;我们自己定义的内容。比如&#xff1a;类的名字、方法的名字和变量的名字等等&#xff1b; 命名规则&#xff1a;&#xff08;硬性要求&#xff09; 标识符可以包含英文字母26个&#xff08;区分大小写&#xff09;&#xff0c;0-9…

ssh源码编译安装mysql_总结源码编译安装mysql

最近在学习源码编译安装LAMP、LNMP时&#xff0c;一直遇到一个难题&#xff0c;就是就是mysql无论怎么源码编译安装&#xff0c;到最后启动服务都提示"Starting MySQL.The server quit without updating PID file (/data/mysql/localhost.pid). [FAILED]&quo…

java中的常量

常量&#xff1a;在程序运行期间&#xff0c;固定不变的量。 常量的分类&#xff1a; 字符串常量&#xff1a;凡是用双引号引起来的部分&#xff0c;如&#xff1a;“abc”,“Hello”,“123”整数常量&#xff1a;直接写上的数字&#xff0c;没有小数点&#xff0c;如&#xf…

mysql blgg__MySQL_exceptions.ProgrammingError:(2014,“命令不同步;您现在无法运行此命令”)?...

-- encoding: utf-8 --db_test.pyCreated on 2019/6/25 11:14Copyright (c) 2019/6/25, 海牛学院版权所有.author: 潘牛from commons.until.db_util import DBUtilfrom configs.config import _HAINIU_DBdb_util DBUtil(_HAINIU_DB)设置字符集是utf8mb4db_util.execute_no_com…

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

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

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

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

数字和字符对照关系表常用(编码表)

ASCII码表&#xff1a;美国信息交换标准代码 Unicode码表&#xff1a;万国码&#xff0c;也是数字和字符的对照关系&#xff0c;开头0-127部分和ASCII完全一样&#xff0c;但是从128开始包含更多字符。 ‘0’——48 ‘A’——65 ‘a’——97

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

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

java中运算的注意事项

运算符&#xff1a;进行特定操作的符号&#xff0c;如&#xff1a; 表达式&#xff1a;用运算符连起来的式子叫做表达式。如&#xff1a;205&#xff0c;ab 四则运算&#xff1a; 加&#xff1a; 减&#xff1a;- 乘&#xff1a;* 除&#xff1a;/ 取模&#xff1a;% 对于一个整…

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

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

三元运算符

一元运算符&#xff1a;只需要一个数据就可以进行操作的运算符&#xff0c;如&#xff1a;取反&#xff0c;自增 二元运算符&#xff1a;需要两个数据才可以进行操作的运算符&#xff0c;如&#xff1a;加&#xff0c;减 三元运算符&#xff1a;需要三个数据才可以进行操作的运…

mysql infile local,MySQL:启用LOAD DATA LOCAL INFILE

Im running Mysql 5.5 on Ubuntu 12 LTS. How should I enable LOAD DATA LOCAL INFILE in my.cnf?Ive tried adding local-infile in my config at various places but Im still getting the "The used command is not allowed with this MySQL version"解决方案Fr…

switch语句使用注意事项

语法 switch&#xff08;&#xff09;{ case &#xff1a; … break&#xff1b; … default: break; } switch语句使用注意事项 多个case后面的数值不可以重复switch后面的小括号当中只能是下列数据类型&#xff1a; 基本数据类型&#xff1a;byte/short/char/int 引用数据类…

python函数内的作用域包括什么_python菜鸟求问关于嵌套函数中作用域范围应该怎么理解?...

直接上代码def l(list):def d():return listreturn d#运行l l([1,2,3,4])print l()这个情况是正常的。问题在于d函数为什么不能传入list,然后我现在尝试了一下这个代码&#xff1a;def l(list):def d(list):return listreturn d#运行l l([1,2,3,4])#提示错误print l()#正常pr…