在我自己的平常开发中很少有见到 javascript 对 sql 的封装比较好的库 (找了一圈也没找到, 应该是暂时我没发现), 因此前期的项目中根据自己的项目情况实现了一套封装方法.
最近我准备写一个这样的库, 基于前期自己对 mysql 的封装 (ThinkPHP 是我使用过的一个 PHP 框架, 对它的模型模块调用 sql 的方式很喜欢) 因此决定参考其 API, 用 javascript 实现一次.
node-transform-mysql 想表达什么
node.js 连接 mysql 的库有很多, 因此觉得没必要自己再封装一个, 为了达到库的广泛使用性, 因此此库只做生成 SQL 语句的功能封装
整个 api 采用链式调用的方式, 这样能最大化的减少开发代码和使用自由度
链式调用方法顺序内部已经做了排序, 因此可以不按严格的 sql 语句顺序来使用方法
sql 调用方法直接参考 ThinkPHP 的 api, 因此不用自己再从新定义方法名称
自由, 简洁, 使用简单是它想表达出来的
完整的 API 说明文档, 写文档比写代码更累, 时间更久, 可见开源框架文档的难能可贵, 为它们致敬
进入正文:
简介: node-transform-mysql 是在 node.js 场景中使用 mysql, 根据传入的参数生成相应的 sql 语句. 它所做的事情很简单也很专一, 只负责生成 sql 语句, 不执行任何实际的增删改查. 你也不用担心它的体量, 整体代码 300 行左右, 压缩之后代码不足 8k.
github 地址: https://github.com/wangweianger/node-transform-mysql
npm 地址: https://www.npmjs.com/package/node-transform-mysql
API 文档地址: https://wangweianger.gitbooks.io/node-transform-mysql/content/
安装:
npm install node-transform-mysql
然后使用一个支持 CommonJS 或 ES2015 的模块管理器, 例如 webpack:
- // 使用 ES6 的转译器, 如 babel
- import sql from node-transform-mysql
- // 不使用 ES6 的转译器
- var sql = require('node-transform-mysql')
sql 调用方法的顺序内部已经做了排序, 因此可以不按严格的 sql 语句顺序来写
简单用法
查询
- sql
- .table('node_table')
- .where('id=1')
- .select()
- SELECT * FROM node_table WHERE id=1
- sql
- .table('node_table')
- .field('id,name')
- .where({id:1})
- .select()
- SELECT id,name FROM node_table WHERE id=1
插入
- sql
- .table('node_table')
- .data({name:'zane',email:'752636052@qq.com'})
- .insert()
- INSERT INTO node_table (name,email) VALUES (`zane`,`752636052@qq.com`)
更新
- sql
- .table('node_table')
- .data({name:'zane',email:'752636052@qq.com'})
- .update()
- UPDATE node_table SET name=`zane`,email=`752636052@qq.com`
删除
- sql
- .table('node_table')
- .where({name:'zane'})
- .delet();
- DELETE FROM node_table WHERE name=`zane`
高级用法
数据库的查询是最复杂的, 因此高级用法主要针对于查询
- // 参数 json 多字段
- sql
- .table('node_table')
- .where({id:1,name:'zane'})
- .select()
- SELECT * FROM node_table WHERE id=1 AND name=`zane`
- // 参数数组
- let data=[
- {id:1,name:'zhangsan',_type:'or'},
- {sex:1,number:3}
- ]
- sql.table('node_table').where(data).select()
- SELECT * FROM node_table WHERE (id=1 OR name=`zhangsan` ) AND (sex=1 AND number=3 )
- // 多字段连接方式
- let data=[
- {id:1,name:'zhangsan',_type:'or',_nexttype:'or'},
- {sex:1,number:3,_type:'and'}
- ]
- sql.table('node_table').where(data).select()
- SELECT * FROM node_table WHERE (id=1 OR name=`zhangsan`) OR (sex=1 AND number=3)
- // 表达式查询
- let data={
- id:{eq:100,egt:10,_type:'or'},
- name:'zhangshan'
- }
- sql.table('node_table').where(data).select()
- SELECT * FROM node_table WHERE ((id=100) OR (id>=10)) AND name=`zhangshan`
- // 混合查询
- let data=[{
- id:{eq:100,egt:10,_type:'or'},
- name:'zhangshan',
- _nexttype:'or'
- },{
- status:1,
- name:{like:'%zane%'}
- }]
- sql.table('node_table').where(data).select()
- SELECT * FROM node_table WHERE (((id=100) OR (id>=10)) AND name=`zhangshan`) OR (status=1 AND ((name LIKE `%zane%`)))
- //UNION , UNION ALL 组合使用
- sql
- .union('SELECT * FROM think_user_1',true)
- .union('SELECT * FROM think_user_2',true)
- .union(['SELECT * FROM think_user_3','SELECT name FROM think_user_4'])
- .union('SELECT * FROM think_user_5',true)
- .select()
得到
- (SELECT * FROM think_user_1) UNION ALL
- (SELECT * FROM think_user_2) UNION ALL
- (SELECT * FROM think_user_3) UNION
- (SELECT name FROM think_user_4) UNION
- (SELECT * FROM think_user_5)
- // 子查询
- let sqlstring = sql.field('id,name').table('node_table').group('field')
- sql.table(sqlstring).group('field').where('id=1').order('status').select()
得到
SELECT * FROM (SELECT id,name FROM node_table GROUP BY field ) WHERE id=1 GROUP BY field ORDER BY status
更多用法请查看详细文档
API 文档地址: https://wangweianger.gitbooks.io/node-transform-mysql/content/
项目运行
- git clone https://github.com/wangweianger/node-transform-mysql.git
- npm install
- //dve
npm run dve
//product
npm run build
此库后期也会根据自己的使用不断的完善, 也欢迎您的建议
如果你绝对对你有帮助, 欢迎给个 star
关注我的博客: zane 的个人博客 https://github.com/wangweianger
来源: http://www.qdfuns.com/article/24749/2a863341520c58eeadc2873959f131d8.html