二十五、Node.js 访问 MySQL 数据库 云少 2020-05-25 2020-05-25 二十五、Node.js 访问 MySQL 数据库 本章节我们将学习如何使用 Node.js 访问和操作 MySQL 数据库
如果你未了解过 MySQL,可以学习我们的 MySQL 基础教程
本章节我们使用到的 SQL 表文件 node_site.sql
安装驱动 我们使用 mysql 访问 MySQL 数据库
引入 mysql 模块 1 var driver = require ('mysql' );
导入数据 在进行数据库操作前,需要将本站提供的 node_site.sql 表 SQL 文件 node_site.sql 导入到 MySQL 数据库 node_site 中
你可以使用以下命令把 node_site.sql 导入到 node_site 数据库中
1 2 3 $ wget https://static/media/node_site.sql $ mysql -uroot -p -e "CREATE DATABASE node_site;" $ mysql -uroot -p --default-character-set=utf8mb4 node_site < node_site.sql
连接 MySQL 数据库 使用 createConnection 方法可以创建连接
使用 connect() 方法可以连接到 MySQL 数据库
你可以根据你的实际配置修改数据库用户名、及密码及数据库名
main.js 1 2 3 4 5 6 7 8 9 10 11 12 13 14 var driver = require ('mysql' );var conn = driver.createConnection ({ host : 'localhost' , user : 'root' , password : '' , database : 'node_site' }); conn.connect (); conn.query ('SELECT 3 + 7 AS sumof' , function (error, results, fields ) { if (error) throw error; console .log ('The sum of 3 + 7 is: ' , results[0 ].sumof ); });
运行以上 Node.js 脚本,输出结果如下
1 2 $ node main.js The sum of 3 + 7 is: 10
createConnection 参数说明 参数 描述 host 主机地址 (默认:localhost) user 用户名 password 密码 port 端口号 (默认:3306) database 数据库名 charset 连接字符集(默认:’UTF8_GENERAL_CI’,注意字符集的字母都要大写) localAddress 此IP用于TCP连接(可选) socketPath 连接到unix域路径,当使用 host 和 port 时会被忽略 timezone 时区(默认:’local’) connectTimeout 连接超时(默认:不限制;单位:毫秒) stringifyObjects 是否序列化对象 typeCast 是否将列值转化为本地JavaScript类型值 (默认:true) queryFormat 自定义query语句格式化方法 supportBigNumbers 数据库支持bigint或decimal类型列时,需要设此option为true (默认:false) bigNumberStrings supportBigNumbers和bigNumberStrings启用 强制bigint或decimal列以JavaScript字符串类型返回(默认:false) dateStrings 强制timestamp,datetime,data类型以字符串类型返回,而不是JavaScript Date类型(默认:false) debug 开启调试(默认:false) multipleStatements 是否许一个query中有多个MySQL语句 (默认:false) flags 用于修改连接标志 ssl 使用ssl参数(与crypto.createCredenitals参数格式一至)或一个包含ssl配置文件名称的字符串,目前只捆绑Amazon RDS的配置文件
更多参数可以参考 : https://github.com/mysqljs/mysql
数据库操作( CURD ) 查询数据 connnection.query() 方法可以查询数据
main.js 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var driver = require ('mysql' );var conn = driver.createConnection ({ host : 'localhost' , user : 'root' , password : '' , database : 'node_site' }); conn.connect (); var sql = 'SELECT * FROM node_site' ;conn.query (sql,function (err, result ) { if (err){ console .log ('[SELECT ERROR] - ' ,err.message ); return ; } console .log ('---------------------SELECT------------------' ); console .log (result); console .log ('---------------------------------------------\n\n' ); }); conn.end ();
运行以上 Node.js 脚本,输出结果如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 $ node main.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 : 3 , name : '腾讯网' , url : 'http://www.qq.com' , alexa : 9 , country : 'CN' }, RowDataPacket { id : 4 , name : '微博' , url : 'http://weibo.com/' , alexa : 20 , country : 'CN' }, RowDataPacket { id : 5 , name : 'Facebook' , url : 'https://www.facebook.com/' , alexa : 3 , country : 'USA' } ] ------------------------------------------------------------
插入数据 connnection.query() 方法可以运行 SQL 语句
main.js 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 var driver = require ('mysql' );var conn = driver.createConnection ({ host : 'localhost' , user : 'root' , password : '' , database : 'node_site' }); conn.connect (); var sql = 'INSERT INTO node_site(id,name,url,alexa,country) VALUES(0,?,?,?,?)' ;var addSqlParams = ['网易' , 'https://www.163.com' ,'11' , 'CN' ];conn.query (sql,addSqlParams,function (err, result ) { if (err){ console .log ('[INSERT ERROR] - ' ,err.message ); return ; } console .log ('----------------INSERT---------------------' ); console .log ('INSERT ID:' ,result); console .log ('-------------------------------------------\n\n' ); }); conn.end ();
运行以上 Node.js 脚本,输出结果如下
1 2 3 4 5 6 7 8 9 10 11 12 $ node main.js ------------------INSERT--------------------- INSERT ID: OkPacket { fieldCount: 0, affectedRows: 1, insertId: 6, serverStatus: 2, warningCount: 0, message: '' , protocol41: true , changedRows: 0 } ----------------------------------------------
然后查看 MySQL node_site 数据库,可以看到我们的数据已经添加了
更新数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 var driver = require ('mysql' );var conn = driver.createConnection ({ host : 'localhost' , user : 'root' , password : '' , database : 'node_site' }); conn.connect (); var sql = 'UPDATE node_site SET name = ? WHERE id = ?' ;var modSqlParams = ['网易新闻' ,6 ];conn.query (sql,modSqlParams,function (err, result ) { if (err){ console .log ('[UPDATE ERROR] - ' ,err.message ); return ; } console .log ('-------------UPDATE----------------------------' ); console .log ('UPDATE affectedRows' ,result.affectedRows ); console .log ('-----------------------------------------------\n\n' ); }); conn.end ();
运行以上 Node.js 脚本,输出结果如下
1 2 3 4 $ node main.js -------------UPDATE---------------------------- UPDATE affectedRows 1 -----------------------------------------------
然后查看 MySQL node_site 数据库,可以看到我们的数据已经变更了
删除数据 现在我们删除 id 为 6 的记录 我们可以使用以下代码来删除 id 为 6 的数据
main.js 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 var driver = require ('mysql' );var conn = driver.createConnection ({ host : 'localhost' , user : 'root' , password : '' , database : 'node_site' }); conn.connect (); var sql = 'DELETE FROM node_site where id = 6' ;conn.query (sql,function (err, result ) { if (err){ console .log ('[DELETE ERROR] - ' ,err.message ); return ; } console .log ('-------------DELETE-----------------------' ); console .log ('DELETE affectedRows' ,result.affectedRows ); console .log ('------------------------------------------\n\n' ); }); conn.end ();
运行以上 Node.js 脚本,输出结果如下
1 2 3 4 $ node main.js -------------DELETE----------------------- DELETE affectedRows 1 ------------------------------------------
然后查看 MySQL node_site 数据库,可以看到 id=6 的记录已经删除了