【问题标题】:Which ORM for node.js? [closed]node.js 的哪个 ORM? [关闭]
【发布时间】:2014-01-27 07:03:43
【问题描述】:

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

我需要的功能是:

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

可选功能:

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

我已经测试过了:

  1. 节点-orm
    • 要处理自己的列名,您需要一种解决方法
    • 不支持软删除,即使使用外部插件也不支持(我尝试使用 beforeRemove 挂钩编写一个,但我可以“阻止”它删除记录)
    • 不支持每个文件的模型(您需要解决方法)
  2. 续集
    • 不要创建外键
    • 无法将属性映射到列名
    • 支持每个文件一个模型,但效果不佳(您需要将关系放入包含模型的文件中)
  3. 节点持久
    • 我不喜欢为所有东西指定连接实例

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

【问题讨论】:

  • 我认为你现在找不到任何接近 Hibernate/Doctrine for Node 的东西 :(
  • sequelize 看起来不错,有一些解决方法,记住这不是 PHP,而且大多数时候事情往往过于异步,所以将它与 async.js 混合,我相信你会得到结果。
  • @GeoPhoenix 这个问题与 PHP 或异步与同步完全无关,关键是我正在寻找一个好的 ORM :)
  • softwarerecs.stackexchange.com 是您关于此问题的网站。
  • 这篇文章应该对你有所帮助:sitepoint.com/3-javascript-orms-you-might-not-know

标签: javascript mysql node.js orm


【解决方案1】:

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

  1. 列到属性名称的映射使用 formatparse 方法。
  2. 使用不同的表名 tableName 属性。
  3. 时间戳可以使用自定义列 hasTimestamp 属性。
  4. 外键可以定义为 knex 架构生成器...它们没有很好的文档记录,但您可以 请参阅测试中的示例here
  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);
}

它还没有挂钩到缓存中,因为关系上的缓存失效非常棘手,肯定是在考虑中。

如果您发现任何似乎丢失的东西,请随时开票。

【讨论】:

  • 列名的属性更多是缺少功能的解决方法,我不想指定扩展每个模型来处理解析和格式,它基本上不支持 FK (如果我需要使用 knex 自己做,与 Bookshelf.js 捆绑在一起,或者与其他东西一起做是没有意义的......定义两个表之间的关系应该用 FK [在大多数情况下]处理)并且,在最后,它非常非常冗长(在方法中定义关系并获取指定哪些相关内容提取根本不好)
  • 为了说明我对 MySQL 的体验,我使用了 waterline、node-orm2、sequelize 和 bookshelf。 Bookshelf 是迄今为止最好的体验,因为它有良好的文档、简单的模型和易于实施。
  • 嗨,我已经使用 Bookshelf 几个月了,我很享受使用它。你在那里构建的非常好的解决方案。我尝试使用 bookshelf-pagemaker 模块为我的 Bookshelf 查询分页。我能够获得基本的分页..但没有看到如何为查询提供 WHERE 子句。我想知道您是否对使用书架进行分页的最佳方式有任何建议。谢谢,这是我的帖子:stackoverflow.com/q/31374653/2162226
【解决方案2】:

你可以看看 light-orm:https://github.com/knyga/light-orm 简单的 ORM。不要创建外键。无法将属性映射到列名。但是可以连接任何rdbms,而且超级简单。

【讨论】:

    猜你喜欢
    • 2011-08-25
    • 2011-08-15
    • 2011-03-27
    • 2014-02-14
    • 1970-01-01
    • 2016-10-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多