哪个ORM for node.js?

我知道这是一个常见的问题,但我已经做了testing,我需要一些特殊的function!

我需要的function是:

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

可选function:

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

我testing过了:

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

现在我要testingJugglingDB和Bookshelf.js(但是我不太喜欢最后一个)。

书架应该目前支持所有这些:

  1. 使用格式和分析方法将列映射到属性名称。
  2. 使用不同的表名与tableName属性。
  3. 时间戳可以使用具有hasTimestamp属性的自定义列。
  4. 外键可以用knex模式构build器来定义…他们没有很好的文档logging,但是你可以在这里看到一个testing例子
  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)); }); 

正式的软删除支持正在进行中,但是通过扩展模型和提供一种新的销毁方法可以很容易实现:

 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,并且超级简单。