nodejs如何简洁优雅的访问mysql数据库
一、前言
nodejs诞生以来出现了一大批的web框架如express koa2 egg等等,前端可以不再依赖后端可以自己控制服务端的逻辑。今天我们就来说说前端在nodejs中如何操作mysql数据库。
二、操作数据库
直接使用mysqljs,比如查询一个字段,代码逻辑看起来是很清晰的,但是仅查询一个字段就需要这么多代码实在是过于麻烦:
一些框架都提供了一些自己的接口去简化CRUD操作,比如egg中提供了egg-mysql:
简单查询条件场景可以解决,但是我们的真实场景的查询条件中各种表关联、各种字段like、in、findinset拼接条件、各种子查询等等操作都满足不了,必须要自己写SQL文。
例如自己写SQL去实现一个服务端分页,实现起来也是比较麻烦的:
那有没有更简洁的方法去操作数据库呢,答案是肯定的社区有很多优秀的orm或sql builder的类库比如objection、sequelize、knexjs、squel等。
三、工具介绍
但在这里要向大家介绍一我们自己的内部的一个更加简洁易用的的nodejs操作mysql的工具类库 ali-mysql-client 它是一个sql builder思路的实现的工具,无需你额外再去定义数据模型更加轻量简洁。
先看一个查询示例,是不是看起来简洁易懂:
下面介绍下它的一些特点:
- SQL Builder能力
提供了select insert update delete的强大的SQL Builder能力
- 丰富的Command
提供了丰富的数据库command更方便的访问数据库
- 条件封装拓展
这里的第三个参数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)
支持自己拓展:
- 动态条件
这个是我们根据我们自己的经验设计的一个参数,在社区目前还没看到过类似的,它的作用主要是用来简化代码,也就是当满足xx条件时则忽略该查询条件,设计的初衷是为了简化代码,比如以下代码是很常见的,界面上有输入值则查询,没有输入值时不做为查询条件
比如界面上有输入值时则当作查询条件,这是很常见的
上面的代码使用ignore时则可简化为:
支持传字符串或传入函数,传入字符串则会匹配到已定义的逻辑,其函数的形式如下:
- 事件支持
当然我们开发时需要查问题看看为什么查询出来的数据不对,所以支持了一些事件,在这些事件中你可以记录你的sql日志或做一些其它的事件
四、使用示例
在koa框架中完整的使用示例:
├── app
│ ├── controller
│ │ └── home.js
│ ├── router.js
│ └── service
│ ├── bar.js
│ └── foo.js
├── app.js
├── config.js
└── package.json
配置文件config.js
入口文件app.js
路由配置router.js
控制器controller/home.js
服务service/foo.js
更多示例
demo-egg
demo-koa
demo-express
四、开源地址
ali-mysql-client 已经开源到了 github 上,目标是为nodejs访问mysql数据库提供强大流畅的api的工具类库,希望访问数据库逻辑都能使用一行代码完成,让访问数据库变得更加简单优雅,大家使用有问题欢迎大家在 github 反馈讨论。