node.js的ORM是哪个?

Dan*_*ano 19 javascript mysql orm node.js

我知道这是一个常见的问题,但我已经完成了测试,我需要一些特殊的功能!

我需要的功能是:

  • 将属性映射到列名称
  • 使用与模型名称不同的表名
  • 支持软删除(sequeloid上的偏执模式)
  • 支持记录时间戳(能够为每个不同的模型指定列名)
  • 支持外键
  • 必须支持mysql和sqlite
  • 架构必须支持每个文件的模型

可选功能:

  • 缓存(支持redis/memcache)
  • 命令行工具从数据库生成模型

我测试过:

  1. 节点ORM
    • 要处理自己的列名称,您需要一种解决方法
    • 软删除不受支持,即使使用外部插件也无法支持(我试图使用beforeRemove挂钩写一个,但我可以"停止"它删除记录)
    • 不支持每个文件的模型(需要一个解决方法)
  2. sequelize
    • 不要创建外键
    • 无法将属性映射到列名称
    • 支持每个文件的模型,但它不能很好地工作(你需要将关系放在包含模型的文件中)
  3. 节点,坚持
    • 我不喜欢为一切指定连接实例

现在我要测试JugglingDB和Bookshelf.js(但我不喜欢最后一个).

tgr*_*ser 19

Bookshelf目前应该支持所有这些:

  1. 使用formatparse方法将列映射到属性名称 .
  2. 使用具有tableName属性的不同表名 .
  3. 时间戳可以使用hasTimestamp 属性的自定义列 .
  4. 可以使用knex模式构建器来定义外键 ...它们没有很好的文档记录,但您可以在此处的测试中看到一个示例
  5. 支持mysql,sqlite和postgres
  6. 绝对支持每个文件一个模型...关系是在方法中定义的,所以你可以这样做:

    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));
      });
    
    Run Code Online (Sandbox Code Playgroud)

正式的软删除支持正在开发中,但通过扩展模型并提供如下所示的新destroy方法,可以轻松实现:

destroy: function(options) {
   if (options.softDelete) {
     return this.save({'deleted_at': new Date});
   }
   return bookshelf.Model.prototype.destroy.call(this, arguments);
}
Run Code Online (Sandbox Code Playgroud)

它还没有挂钩到缓存,因为关系上的缓存失效是相当棘手的,绝对是正在考虑的事情.

如果您看到任何似乎缺失的东西,请随意打开机票.

  • 只是要注意我对MySQL的经验,我使用过waterline,node-orm2,sequelize和bookshelf.Bookshelf是迄今为止最好的体验,因为它具有良好的文档,简单的模型和易于实现. (3认同)