我知道这是一个常见问题,但我已经完成了测试,我需要一些特殊功能!
我需要的功能是:
- 将属性映射到列名
- 使用不同于模型名称的表名
- 支持软删除(续集的偏执模式)
- 支持记录时间戳(能够为每个不同的模型指定列名)
- 支持外键
- 必须支持mysql和sqlite
- 架构必须支持每个文件的模型
可选功能:
- 缓存(支持 redis/memcache)
- 从数据库生成模型的命令行工具
我已经测试过了:
- Node -orm
- 要处理自己的列名,您需要一种解决方法
- 不支持软删除,即使使用外部插件也不支持(我尝试使用 beforeRemove 钩子(Hook)编写一个,但我可以“阻止”它删除记录)
- 不支持每个文件的模型(您需要解决方法)
- 续集
- 不要创建外键
- 无法将属性映射到列名
- 支持每个文件一个模型,但效果不是很好(您需要将关系放入包含模型的文件中)
- Node 持久化
- 我不喜欢为所有东西指定连接实例
现在我要测试 JugglingDB 和 Bookshelf.js(但我不太喜欢最后一个)。
最佳答案
Bookshelf 目前应该支持所有这些:
- 将列映射到属性名称 format和 parse方法。
- 使用不同的表名 tableName属性。
- 时间戳可以采用自定义列 hasTimestamp 属性。
- 外键可以定义为 knex架构生成器......他们没有很好的记录,但你可以 查看测试中的示例here
- 支持 mysql、sqlite 和 postgres
绝对支持每个文件一个模型...关系在方法中定义,所以你可以这样做:
var Classroom = Bookshelf.Model.extend({ tableName: 'classrooms', student: function() { // Relating to a model from a file in the same directory. return this.hasMany(require('./student')); } }); new Classroom({id: 1}) .fetch({withRelated: ['students']) .then(function(classroom) { console.log(JSON.stringify(classroom)); });
官方的软删除支持正在开发中,但通过扩展模型并提供新的销毁方法肯定很容易实现,如下所示:
destroy: function(options) {
if (options.softDelete) {
return this.save({'deleted_at': new Date});
}
return bookshelf.Model.prototype.destroy.call(this, arguments);
}
它还没有挂接到缓存中,因为关系上的缓存失效非常棘手,肯定是在考虑中。
如果您发现任何似乎缺少的东西,请随时开票。
关于javascript - node.js 的哪个 ORM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19447850/