JQL数据库操作
JQL,全称 javascript query language,是一种js方式操作数据库的规范。
- JQL大幅降低了js工程师操作数据库的难度,比SQL和传统MongoDB API更清晰、易掌握。
- JQL支持强大的DB Schema,内置数据规则和权限。DB Schema 支持uni-id,可直接使用其角色和权限。无需再开发各种数据合法性校验和鉴权代码。
- JQL利用json数据库的嵌套特点,极大的简化了联表查询和树查询的复杂度,并支持更加灵活的虚拟表。
jql的诞生背景
传统的数据库查询,有sql和nosql两种查询语法。
- sql是一种字符串表达式,写法形如:
select * from table1 where field1="value1"
- nosql是js方法+json方式的参数,写法形如:
const db = uniCloud.database()
let res = await db.collection('table').where({field1: 'value1'
}).get()
sql写法,对js工程师而言有学习成本,而且无法处理非关系型的MongoDB数据库,以及sql的联表查询inner join、left join也并不易于学习。
而nosql的写法,实在过于复杂。比如如下3个例子:
- 运算符需要转码,>需要使用gt方法、==需要使用eq方法
比如一个简单的查询,取field1>0,则需要如下复杂写法
const db = uniCloud.database()
const dbCmd = db.command
let res = await db.collection('table1').where({field1: dbCmd.gt(0)
}).get()
如果要表达或关系,需要用or方法,写法更复杂
const db = uniCloud.database()
const dbCmd = db.command
let res = await db.collection('table1').where({field1:dbCmd.gt(0).or(dbCmd.lt(-5))
}).get()
而nosql的联表查询写法,比sql还复杂
sql的inner join、left join已经够乱了,而nosql的代码无论写法还是可读性,都更“令人发指”。比如这个联表查询:
const db = uniCloud.database()
const dbCmd = db.command
const $ = dbCmd.aggregate
let res = await db.collection('orders').aggregate()
.lookup({from: 'books',let: {order_book: '$book',order_quantity: '$quantity'},pipeline: $.pipeline().match(dbCmd.expr($.and([$.eq(['$title', '$$order_book']),$.gte(['$stock', '$$order_quantity'])]))).project({_id: 0,title: 1,author: 1,stock: 1}).done(),as: 'bookList',
})
.end()
这些问题竖起一堵墙,让后端开发难度加大,成为一个“专业领域”。但其实这堵墙是完全可以推倒的。
jql将解决这些问题,让js工程师没有难操作的数据库。
具体看以下示例
const db = uniCloud.database()// 使用`jql`查询list表内`name`字段值为`hello-uni-app`的记录
db.collection('list').where('name == "hello-uni-app"').get().then((res)=>{// res 为数据库查询结果}).catch((err)=>{// err.message 错误信息// err.code 错误码})
JQL流程图解
下图包括clientDB及云函数内使用jql扩展库的调用流程
JQL包含的模块
这里选择以使用了JQL完整功能clientDB为例,JQL操作数据库的流程如下
不同场景的区别
上述场景在新增、修改数据时都会执行数据校验,但是关于权限校验及action部分稍有不同
JQL数据库管理器:
- 不会校验任何权限,相当于以数据库管理员的身份执行
- 即使是admin不能读写的password类型数据也可以读写
- 不会触发数据库触发器
- 不可以执行action云函数
客户端clientDB:
- 完整的权限校验,执行操作的用户不可以操作自己权限之外的数据
- admin用户不可操作password类型的数据
云函数JQL:
- 同clientDB,但是password类型的数据可以配置权限,默认权限是false,可以被admin用户操作。
- 可以通过setUser指定当前执行数据库操作的用户身份。