前提:已安装MySql Server
内容:使用Node.js的MySQL驱动来实现Node.js持久化
安装
下载mysql依赖:
npm i mysql –S
导入mysql模块
const mysql = require('mysql')
介绍
Node.js的MySQL驱动由JS编写,不需要编译,MIT开源。使用方法非常简单。
Node.js的mysql驱动地址:
https://github.com/mysqljs/mysql
官方的例子如下:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'me',
password : 'secret',
database : 'my_db'
});
connection.connect();
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
connection.end();
通过以上例子,我们知道了使用Node.js的原生MySQL驱动主要通过以下方法:
- mysql.createConnection(cfg):创建连接对象,传入连接配置
连接配置:
连接配置是一个对象,包含的项如下:- host: 连接数据库所在的主机名. (默认: localhost)
- port: 连接端口. (默认: 3306)
- localAddress: 用于TCP连接的IP地址. (可选)
- socketPath: 链接到unix域的路径。在使用host和port时该参数会被忽略.
- user: MySQL用户的用户名.
- password: MySQL用户的密码.
- database: 链接到的数据库名称 (可选).
- charset: 连接的字符集. (默认: 'UTF8_GENERAL_CI'.设置该值要使用大写!)
- timezone: 储存本地时间的时区. (默认: 'local')
- stringifyObjects: 是否序列化对象. See issue #501. (默认: 'false')
- insecureAuth: 是否允许旧的身份验证方法连接到数据库实例. (默认: false)
- typeCast: 确定是否讲column值转换为本地JavaScript类型列值. (默认: true)
- queryFormat: 自定义的查询语句格式化函数.
- supportBigNumbers: 数据库处理大数字(长整型和含小数),时应该启用 (默认: false).
- bigNumberStrings: 启用 supportBigNumbers和bigNumberStrings 并强制这些数字以字符串的方式返回(默认: false).
- dateStrings: 强制日期类型(TIMESTAMP, DATETIME, DATE)以字符串返回,而不是一javascript Date对象返回. (默认: false)
- debug: 是否开启调试. (默认: false)
- multipleStatements: 是否允许在一个query中传递多个查询语句. (Default: false)
- flags: 链接标志.
你也可以直接使用一个字符串来连接数据库
var connection = mysql.createConnection('mysql://user:pass@host/db?debug=true&charset=BIG5_CHINESE_CI&timezone=-0700');
- connection.connect() : 连接数据库
- connection.query(sql,(err,result)=>{}):查询语句,此驱动所有sql语句都通过query语句执行
- connection.end():关闭连接,在关闭连接时需要确认所有的query语句都执行完毕。需要放在顺序执行的最后。如果query出错,仍然会终止连接,错误会传递到回调函数中处理。还要一个connection.destroy()方法的作用也是结束数据库连接,与end方法不同的是,destroy方法会立即终止连接,即使还有query方法还没有完成,也不会触发回调函数。
每个使用在连接对象上的方法都是同步的,顺序执行的。意味着此驱动没有提供异步的想promise的方法。
实例步骤1、连接数据库
新建mysql.js
文件,安装并引入mysql模块,设置用户密码等连接数据库:
const mysql = require('mysql')
//连接配置
const cfg = {
host:'localhost',
user:'root',//默认root用户
password:'admin',
database:'test',
}
//创建连接对象
const conn = mysql.createConnection(cfg);
//连接数据库
conn.connect(err =>{
if(err){
throw err
}
console.log("连接成功")
})
运行文件:
nodemon .\mysql
nodemon可自动监测node.js文件变化
运行结果
也可以通过查询语句来连接数据库
const mysql = require('mysql')
//连接配置
const cfg = {
host:'localhost',
user:'root',//默认root用户
password:'admin',
database:'test',
}
//创建连接对象
const conn = mysql.createConnection(cfg);
//连接并执行sql
conn.query('SELECT 1', function (error, results, fields) {
if (error) throw error;
console.log("连接成功")
});
执行结果:
执行结果
实例步骤2、使用连接池
mysql驱动提供了连接池来提高查询和操作效率。
实例如下:
var pool = mysql.createPool({
connectionLimit : 10,
host:'localhost',
user:'root',//默认root用户
password:'admin',
database:'test',
});
pool.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
if (error) throw error;
console.log("连接成功")
console.log('The solution is: ', results[0].solution);
});
执行结果:
执行结果
通过以上实例,使用连接池的方法如下:
- mysql.createPool(cfg):传入连接配置,这个方法是
pool.getConnection() -> connection.query() -> connection.release()
的一个简单版本,connection.release()释放链接到连接池。如果需要关闭连接并且删除,需要使用connection.destroy()
pool除了接受和connection相同的参数外,还接受几个扩展的参数- createConnection: 用于创建链接的函数. (Default: mysql.createConnection)
- waitForConnections: 决定当没有连接池或者链接数打到最大值时pool的行为. 为true时链接会被放入队列中在可用是调用,为false时会立即返回error. (Default: true)
- connectionLimit: 最大连接数. (Default: 10)
- queueLimit: 连接池中连接请求的烈的最大长度,超过这个长度就会报错,值为0时没有限制. (Default: 0)
实例步骤3、使用query
通过上述我们知道query方法是mysql驱动进行sql语句执行的唯一方法,创建几个sql语句并执行如下:
const mysql = require('mysql')
//连接配置
const cfg = {
host:'localhost',
user:'root',//默认root用户
password:'admin',
database:'test',
}
//创建连接对象
const conn = mysql.createConnection(cfg);
//sql语句
const CREATE_SQL = `CREATE TABLE IF NOT EXISTS test (
id INT NOT NULL AUTO_INCREMENT,
message VARCHAR(45) NULL,
PRIMARY KEY (id))`;
const INSERT_SQL = `INSERT INTO test(message) VALUES(?)`;
const SELECT_SQL = `SELECT * FROM test`;
//连接数据库
conn.connect(err =>{
if(err){
throw err
}
console.log("连接成功")
//创建表
conn.query(CREATE_SQL,(err) =>{
//插入数据
//格式化sql语句并输出
const sql = mysql.format(INSERT_SQL,'hello');
console.log(sql);
conn.query(INSERT_SQL,'hello',(err,result)=>{
console.log(result);
conn.query(SELECT_SQL,(err,results)=>{
console.log(results);
//不使用连接池时需要关闭
conn.end();
})
})
})
})
运行如下:
执行结果
我们知道mysql驱动是不提供promise方法的,如果我们想使用,我们可以自己封装一个query方法:
//封装
function query(conn,sql,param=null){
return new Promise((resolve,reject)=>{
conn.query(sql,param,(err,results)=>{
if(err){
reject(err)
}else{
resolve(results)
}
})
})
}
使用方法如下:
query(conn,SELECT_SQL).then(results=>{
console.log(results)
}).catch(err=>{
console.log(err)
})