Node.js使用MySql驱动进行持久化实例

前提:已安装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)
    })
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 是的,我从未想过,刚毕业的我就直接开始了创业之旅。 我是2015年的本科毕业生,念的是软件工程专业,主攻Andri...
    小钢钢钢阅读 4,042评论 23 10
  • 一、实体商店如何根据人们的生理特点来促进销售? 人的生理结构决定了我们在购物时的一些特点,比如需要一些缓冲时间,我...
    铎耀阅读 2,795评论 0 0
  • 《追风筝的人》里男主阿米尔的父亲说:世界上只有一个罪:盗窃。当你杀害一个人,你偷走一条性命,你偷走他为人父的权利,...
    月野耕在吃草阅读 4,177评论 1 7

友情链接更多精彩内容