我是靠谱客的博主 快乐小蚂蚁,最近开发中收集的这篇文章主要介绍Node.js 如何优雅的操作 MySQL 数据库简介,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

简介

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,或者说是一个 JS 语言解释器。得益于JavaScript事件驱动、非阻塞式I/O的特性,采用node.js编写的web服务器具有良好的性能,且天生支持高并发。同时对于具有JavaScript语言基础的前端开发人员十分友好,学习和开发成本极低。

mysql 模块

作为服务端语言,必然会涉及数据库的操作,以最常见的关系型数据库MySQL为例,npm 为我们提供了mysql 第三方模块,用来在node中通过代码来对数据库中的数据进行增删改查,具体用法如下:

  • 使用 cnpm 安装 mysql 模块

$ cnpm install mysql
  • 在 test.js 实例文件中引入 mysql 模块

const mysql      = require('mysql');
  • 调用 mysql 模块内置方法,访问数据库

const connection = mysql.createConnection({
 host     : 'localhost',
 user     : 'root',     // 以自己数据库信息为
 password : '123456',
 database : 'test'
});
connection.connect();
  • 执行 sql 查询语句

let sql = 'SELECT 1 + 1 AS solution'
connection.query( sql, function (error, results, fields) {
 if (error) throw error;
 console.log('The solution is: ', results[0].solution);
});
  • 运行 test.js 文件

$ node test.js
  • 输出结果

The solution is: 2

存在的问题

虽然 mysql 模块为我们提供了完善的操作数据库的能力,但不难发现这种 sql 语句执行方式较为麻烦,且写法过于冗杂

改进

一些框架都提供了一些自己的接口去简化CRUD操作,比如egg中提供了egg-mysql:

const results = yield app.mysql.select('posts',{
where: { status: 'draft' },
orders: [['created_at','desc'], ['id','desc']],
limit: 10,
offset: 0
});

简单查询条件场景可以解决,但是我们的真实场景的查询条件中各种表关联、各种字段like、in、findinset拼接条件、各种子查询等等操作都满足不了,必须要自己写SQL文。

例如自己写SQL去实现一个服务端分页,实现起来也是比较麻烦的:

// 拼接各种条件
let whereSql = 'where online_version is not null and state <> 1';
if (scope == 'only') {
whereSql += ' and use_scope like "%' + query.use_scope + '%"';
}
whereSql += handleIn(query) + handleEqual(query) + handleLike(query);
​
// 取得全部数据条数
const sqlTotal = 'select count(*) as total from component' + whereSql;
const resultTotal = yield this.app.mysql.query(sqlTotal, values);
​
// 取得当前页数据
let sqlSelect = 'select * from component'
sqlSelect += whereSql;
sqlSelect += ' order by modified_time desc, id desc limit ';
sqlSelect += (pageIndex - 1) * pageSize + ',' + pageSize;
const resultList = yield this.app.mysql.query(sqlSelect, values);
​
// 返回分页结果
const result = {
list: resultList,
total: resultTotal[0].total,
};
return result;

所以,我们希望寻求一种更加简洁易用的的 node.js 操作 mysql 的工具类库

ali-mysql-client

在这里向大家推荐 ali-mysql-client ,它是一个sql builder思路的实现的工具,无需你额外再去定义数据模型更加轻量简洁。

  • 事例

// 查询单个值,比如下面例子返回的是数字51,满足条件的数据条数
const result = await db
.select("count(1)")
.from("page")
.where("name", "测试", "like")
.queryValue();
​
// 查询多条数据(服务端分页) 返回的是 ressult = {total: 100, rows:[{...}, {...}]};
const result = await db
.select("*")
.from("page")
.where("id", 100, "lt") // id < 100
.queryListWithPaging(3, 20); //每页 20 条,取第 3 页
  • SQL Builder能力

ali-mysql-client提供了select insert update delete的强大的SQL Builder能力

// 构造查询
const query = db
.select("a.a1, b.b1, count(a.c) as count")
.from("table as a")
.join("table2 as b")
.where("a.date", db.literals.now, "lt") // date < now()
.where("a.creator", "huisheng.lhs")     // creator = 'huisheng.lhs"
.groupby("a.a1, b.b1")
.having("count(a.category) > 10")
.orderby("a.id desc");
 
// 构造插入
const tasks = [ task1, taks2, task3 ];
const insert = db
.insert("task", tasks)
.column('create_time', db.literals.now)  // 循环赋值给每一行数据
.column('create_user', 'huisheng.lhs');
 
// 构造更新
const update = db
.update("task", task)
.column("create_time", db.literals.now) //支持增加字段
.where('id', 2)
 
// 构造删除
const delet = db
.delete("task")
.where("id", 1)
  • 丰富的Command

// 查询command
const select = builderSelect();
​
// 查询一个字段值 value
const result1 = await select.queryValue();
​
// 查询单行数据 {id:12, name: '测试页面', ....}
const result2 = await select.queryRow();
​
// 查询数据列表 [{...}, {...}];
const result3 = await select.queryList();
​
// 服务端分页查询 {total: 100, rows:[{...}, {...}]};
const result4 = await select.queryListWithPaging();
​
// 执行插入更新删除
const result5 = await insert.execute();
const result6 = await update.execute();
const result7 = await delete.execute();
​
// 也支持直接传入sql
const result8 = await db.sql(sql, values);
  • 条件封装拓展

const result = await db
.select("*")
.from("page")
.where("id", 100) // id = 100
.where("name", 'test', "like") // name like '%test%'
.queryList();

这里的第三个参数operator就是我们封装的条件逻辑,可传入字符串或函数,不传时默认是equal,

在类库中内置了以下操作符:

eq (equal)
ne (not equal)
in (in)
gt (greater than)
ge (greater than or equal)
lt (less than)
le (less than or equal)
isnull (is null)
isnotnull (is not null)
like (like)
startwith (start with)
endwith (end with)
between (between)
findinset (find_in_set(value, field))
insetfind (find_in_set(field, value))
sql (custom sql)
keywords (keywords query)

支持自己拓展:

const config = db.config();
// 自定义operator
config.registerOperator('ne', ({ field, value }) => {
 return { sql: '?? <> ?', arg: [ field, value ] };
});

在自己的项目中使用

目前 ali-mysql-client 已经在 npm 发布,你可以使用以下命令直接安装并引入到自己的项目:

$ npm i ali-mysql-client
const mysql = require('ali-mysql-client')

具体使用详情见 npm: ali-mysql-client

转载自:Node.js 如何简洁优雅的访问 MySQL 数据库 - 掘金

最后

以上就是快乐小蚂蚁为你收集整理的Node.js 如何优雅的操作 MySQL 数据库简介的全部内容,希望文章能够帮你解决Node.js 如何优雅的操作 MySQL 数据库简介所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部