Leoric 是一个类似 Active Record 的 JavaScript 的 ORM 模块,从一个内部版本中重构出的方案。先前在 reddit.com/r/node 发过一则广告帖,要回答的第一个问题应该都是差不多的,就是“Leoric 和市面上现有的 JavaScript ORM 模块相比优势在哪?”
Leoric 非常新,在性能方面测试还不充分,就目前而言,它的优势在于它的 API 非常简单而且强大。例如在编写查询条件时,遇到 ||
复合条件的时候,用 mongoose 或者 knex 可能需要这样写:
Table.find({ $or: [ { foo: null }, { foo: values } ] })
// or with knex
Table.where({ foo: null }).orWhere({ foo: values })
用 Leoric 只需:
Table.find('foo = null or foo = ?', values)
如果还要考虑伪删除(不真正 DELETE 记录,而是使用 deleted_at
字段标记),在 mongoose 或者 knex 里是:
// MongoDB-like
Table.find({ $and: [ { $or: [ { foo: null }, { foo: values } ] }, { deletedAt: null }]
// formatted
Table.find({
$and: [
{
$or: [
{ foo: null },
{ foo: values }
]
},
{ deletedAt: null }
]
})
// or with knex
Table.where(function() {
this.where({ foo: null }).orWhere({ foo: values })
}).andWhere({ deletedAt: null })
在 Leoric 里则是:
Table.find('(foo = null or foo = ?) and deletedAt is null', values)
另一个可以体现 Leoric 和其他 ORM 模块区别的地方是关联关系的配置与使用,以 Objection.js 为例,要设置一个 belongsTo
关联:
class Animal extends Model {
static relationMappings = {
owner: {
relation: Model.BelongsToOneRelation,
modelClass: Person,
join: {
from: 'animal.ownerId',
to: 'person.id'
}
}
}
}
在 Leoric 里则是:
class Animal extends Bone {
static describe() {
this.belongsTo('owner', { Model: 'Person' })
}
}
Leoric 是我在 2017 年交出的两份 Node.js 答卷之一,希望能给各位 Web developer 带来帮助。欢迎阅读官方介绍文档、以及 Github
又是这种魔符啊。
多用函数式和声明式,才是符合人类的操作吧。
$or操作都也没什么不好,前端需要多条件的复杂查询,直接传个Object过来就很省事了。
而不用拼这么一个字符串,或者服务端把Object转成这样的字符串
来自酷炫的 CNodeMD
“这种魔符”指的是啥哇? 其实这里的重点不是讨论 object condition 和 templated string condition 哪个更好,只是想给更喜欢 template string condition 的 Node.js 开发者一个选择。 “而不用拼这么一个字符串,或者服务端把 Object 转成这样的字符串” 这一句我也不太懂,尤其是后半句。
@dotnil
魔符就是magic string
, 简单来说, 学习这个工具, 还得学习这个工具的模板语法.
“而不用拼这么一个字符串,或者服务端把 Object 转成这样的字符串”
比如客户端需要查询 这个条件
$or: [
{ foo: null },
{ foo: values }
]
客户端可以直接把这个json丢给服务端, 服务端拿到就可以直接查询.
如果服务端的ORM需要这种格式(foo = null or foo = ?) and deletedAt is null
, 那么要么是客户端转换, 要么是服务端转换
头一次见到这样的翻译,我孤陋寡闻了哈哈哈。
(foo = null or foo = ?) and deletedAt is null
只是一个条件表达式,如果觉得 is null
太 sql,写成 (foo = null or foo = ?) and deletedAt = null
除了 ==
变成 =
,其余跟 js 语句毫无差别。只要底层是使用 sql 交互的关系型数据库,客户端无论是传 object 还是 string,最终都还是得转成 (foo = null or foo = ?) and deletedAt is null
的格式。这句表达式对应的 object condition 写法完整的是:
{
$and: [
{
$or: [
{ foo: null },
{ foo: values }
]
},
{ deletedAt: null }
]
}
我是觉得这样太繁琐了,相当于我帮别人 ORM 库写 sql ast,再让它帮我序列化出字符串跟 mysql 或者其他数据库交互,因此造了这个轮子。如果你觉得写 object condition 很直观,那确实 Leoric 不太适合你的使用习惯。
同意一楼,这样反而倒退了