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)
    })
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容