NodeJS操作MySQL本文是一篇使用NodeJS模块MySQL操作MySQL数据库的基础教程。驱动安装npminstallmysql连接数据库下面的例子根据自己的实际配置修改数据库用户名、密码和数据库名:varmysql=require('mysql');varconnection=mysql.createConnection({host:'localhost',用户:'root',密码:'root',数据库:'gov'});connection.connect();//连接到数据库connection.query('select*fromgov_policy',function(error,results,fields){if(error)throwerror;console.log('Theresultsis:',results);console.log(fields);});connection.end()//关闭连接数据库连接参数说明参数说明host主机地址(默认:localhost)用户用户名密码密码port端口号(默认:3306)database数据库名称charset连接字符集(default:'UTF8_GENERAL_CI',注意字符集的字母一定要大写)localAddress这个IP用于TCP连接(可选)socketPath连接unix域路径,使用host和port时会被忽略timezone时区(默认:'local')connectTimeout连接超时时间(默认:无限制;单位:毫秒)stringifyObjects是否序列化对象typeCast是否将列表值转换为本地JavaScript类型值(默认:true)queryFormat自定义查询语句格式化方法supportBigNumbers时数据库支持bigint或decimal类型的列,需要将此选项设置为true(default:false)bigNumberStringssupportBigNumbers和bigNumberStrings启用强制bigint或decimal列以JavaScriptstring类型返回(default:false)dateStrings强制时间stamp、datetime和数据类型以字符串形式返回,而不是JavaScript日期类型(默认值:false)debug启用调试(默认值:false)multipleStatements是否允许在一个查询中使用多个MySQL语句(默认值:false)flagsformodification连接标志ssl使用ssl参数(与crypto.createCredenitals参数格式相同)或包含ssl配置文件名称的字符串。目前,仅捆绑了AmazonRDS配置文件。更多信息请参考:https://github.com/mysqljs/mysql数据库操作(CURD)在进行数据库操作之前,可以对已有数据进行操作,也可以新建数据进行操作,也可以使用NodeJS的Faker模块生成批量假数据来操作本教程测试的MySQL用户名称为root,密码为root,数据库为gov。需要根据自己的配置进行修改。查询数据执行如下代码查询数据:varmysql=require('mysql');varconnection=mysql.createConnection({host:'localhost',user:'root',password:'root',port:'3306',database:'gov'});connection.connect();varsql='select*fromgov_policy';//checkconnection.query(sql,function(err,result){if(err){console.log('[SELECTERROR]-',err.message);return;}console.log('------------------------SELECT----------------------------');console.log(result);console.log('-----------------------------------------------------------\n\n');});connection.end();执行上述命令,输出为:$nodetest.js----------------------------SELECT--------------------------[RowDataPacket{id:1,name:'Google',url:'https://www.google.cm/',alexa:1,country:'USA'},RowDataPacket{id:2,name:'淘宝',url:'https://www.taobao.com/',alexa:13,country:'CN'},......RowDataPacket{id:4,name:'微博',你的l:'http://weibo.com/',alexa:20,country:'CN'},RowDataPacket{id:5,name:'Facebook',url:'https://www.facebook.com/',alexa:3,country:'USA'}]--------------------------------------------------------插入数据我们可以向数据表中插入数据:varmysql=require('mysql');varconnection=mysql.createConnection({主机:'localhost',用户:'root',密码:'root',端口:'3306',数据库:'gov'});connection.connect();varaddSql='INSERTINTOwebsites(Id,name,url,alexa,country)VALUES(0,?,?,?,?)';varaddSqlParams=['博客论坛','https://segmentfault.com','NodeJS','中国'];//添加connection.query(addSql,addSqlParams,function(err,result){if(err){console.log('[INSERTERROR]-',err.message);return;}console.log('---------------插入---------------');//console.log('INSERTID:',result.insertId);console.log('INSERTID:',result);console.log('--------------------------------------------------------------\n\n');});connection.end();更新数据我们也可以修改数据库中的数据:varmysql=require('mysql');varconnection=mysql.createConnection({host:'localhost',user:'root',密码:'root',端口:'3306',数据库:'gov'});connection.connect();varmodSql='UPDATEwebsitesSETname=?,url=?WHEREId=?';varmodSqlParams=['ThinkForum','https://segmentfault.com',6];//改变connection.query(modSql,modSqlParams,function(err,result){if(err){console.log('[UPDATEERROR]-',err.message);return;}console.log('--------------------------UPDATE---------------------------');console.log('UPDATEaffectedRows',result.affectedRows);控制台。日志('------------------------------------------\n\n');});connection.end();输出结果为:---------------------更新------------------------更新受影响的行1--------------------------------------------------------------删除数据我们可以使用下面的代码来删除id为6的数据:varmysql=require('mysql');varconnection=mysql.createConnection({host:'localhost',user:'root',password:'root',port:'3306',database:'gov'});connection.connect();vardelSql='DELETEFROMwebsiteswhereid=6';//deleteconnection.query(delSql,function(err,result){if(err){console.log('[DELETEERROR]-',err.message);return;}console.log('-----------------------删除--------------------------');console.log('DELETEaffectedRows',result.affectedRows);console.log('--------------------------------------------------------------\n\n');});connection.end();执行以下命令,输出将是:---------------------------DELETE----------------------------DELETEaffectedRows1------------------------------------------------------------流式读取数据当有千万级数据时,以上普通查询操作会导致内存占用高,也就是数据会先缓存起来再返回给我们。如果数据量很大,需要流式读取,占用内存少:varmysql=require('mysql');变种连接=mysql.createConnection({主机:'localhost',用户:'root',密码:'root',端口:'3306',数据库:'gov'});connection.connect();varsql='SELECT*FROMgov_policy_old';constquery=connection.query(sql);query.on('error',function(err){console.log(err);}).on('fields',function(fields){//console.log(字段);}).on('result',function(row){console.log(row['title']);}).on('end',function(){connection.end();})参考MySqlJS
