哪个ORM for node.js?
我知道这是一个常见的问题,但我已经做了testing,我需要一些特殊的function!
我需要的function是:
- 将属性映射到列名称
- 使用不同于型号名称的表格名称
- 支持软删除(在sequelize偏执模式)
- 支持logging时间戳(能够为每个不同的模型指定列名)
- 支持外键
- 必须支持mysql和sqlite
- 架构必须支持每个文件的模型
可选function:
- caching(支持redis / memcache)
- 命令行工具从数据库生成模型
我testing过了:
- 节点ORM
- 处理自己的列名称,你需要一个解决方法
- 软删除不支持,即使使用外部插件(我试图写一个使用beforeRemove挂钩,但我可以“停止”它删除logging)
- 不支持每个文件的模型(你需要一个解决方法)
- sequelize
- 不要创build外键
- 无法将属性映射到列名称
- 支持每个文件的模型,但是它不能很好地工作(你需要把关系放在包含模型的文件中)
- 节点,坚持
- 我不喜欢指定连接实例的一切
现在我要testingJugglingDB和Bookshelf.js(但是我不太喜欢最后一个)。
书架应该目前支持所有这些:
- 使用格式和分析方法将列映射到属性名称。
- 使用不同的表名与tableName属性。
- 时间戳可以使用具有hasTimestamp属性的自定义列。
- 外键可以用knex模式构build器来定义…他们没有很好的文档logging,但是你可以在这里看到一个testing例子
- 支持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); }
它还没有挂钩到caching中,因为caching对关系的失效是相当棘手的,绝对是值得考虑的事情。
如果您看到任何似乎不见的东西,请随时打开一张票。
你可以看看light-orm: https : //github.com/knyga/light-orm简单的ORM。 不要创build外键。 无法将属性映射到列名称。 但可以连接到任何rdbms,并且超级简单。