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指定当前执行数据库操作的用户身份。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/24124.html