【问题标题】:sequelize for NodeJS: are these features supported?NodeJS 的续集:是否支持这些功能?
【发布时间】:2012-03-17 15:46:08
【问题描述】:

以下是关于 sequelize (sequelize project site) 支持的功能的一些问题,我想在决定是否使用它之前先弄清楚:

  1. 链接(效率):链接多个查询时,这些查询是收集到一个对数据库的请求中(作为一批操作),还是每个单独发送?

  2. 链接(成功/错误):链接多个查询时,何时发出成功事件以及发生错误时会发生什么?只有当 all 操作成功时才​​会发出“成功”?如果出现错误,是否会回滚所有操作(即是否将链式操作视为事务)

  3. 过滤关联:假设Crowd 对象具有关系Crowd.hasMany(Person)。你可以通过执行crowd.getPersons()得到所有关联的人,但是是否可以选择他们的一个子集,比如crowd.getPersons({where: { age: 30 }})

  4. 获取通过两个或多个步骤关联的关联对象:将Crowd 对象称为关系Crowd.hasMany(Person)Person 具有关系Person.hasMany(Pet)。是否可以通过执行crowd.getPersons().getPets() 之类的操作来获取人群中所有人的宠物,如果可以,这会作为多个请求发送到数据库,还是仅发送一个请求?

  5. “深”对象:我想定义一个人为对象:

    sequelize.define('Person', {
        name: {
            first: <a string>,
            last: <a string>
        }
    });
    

    这是允许的吗? (请注意,名称不会是数据库表的列,而是第一个和最后一个)

  6. “计算”对象:是否可以在对象中添加一个字段,该字段是根据对象的其他字段计算得出的?例如:

    sequelize.define('Person', {
        name: {
            first: <a string>,
            last: <a string>,
            full: <name.first + ' ' + name.last> // <-- this field
        }
    });
    

    所以name.full 字段实际上并没有存储在数据库中(这很浪费空间),而只是从其他两个中计算出来的?

【问题讨论】:

    标签: database node.js sequelize.js


    【解决方案1】:

    1.:您可以使用QueryChainer进行超级duper批处理。尽管如此,每个命令都会分开执行。

    2.:使用 QueryChainer,只有在一切正常的情况下才会触发成功事件。如果发生一个或多个错误,则触发错误。绑定方法的第一个参数将是一个错误数组。

    3.:嗯,我不是 100% 确定,但恕我直言,它还不支持。

    4.: 不,不可能,但更复杂,更不花哨:

    crowd.getPeople().success(function(people) {
      people.forEach(function(person){
        person.getPets().success... // you have to collect them on your own
      })
    })
    

    5.:不。但我也不明白你为什么要这么做。

    6.:是的,请查看http://sequelizejs.com/docs/1.7.8/models#expansion-of-models 和:

    Person = sequelize.define('Person', {foo:Sequelize.STRING}, {
      instanceMethods: {
        fullname: function() {
          return this.firstName + ' ' + this.lastName
        }
      }
    })
    

    【讨论】:

    • 那么对于#2,如果其中一个请求出现错误,它会回滚所有请求(就像在事务中发生的那样)?还是链接请求不被视为事务?
    • 它们不被视为事务,而是愉快地彼此分开执行并返回所有发生的错误作为结果
    • 如果您可以定义在序列化对象时使用的 getter 和 setter,而不是简单地添加实例方法,那就太好了。
    • 关于第3点,我不确定新版本是否还有,但是2.0.0-rc3版本有。
    • @freakTheMighty 我没试过,但我想你可以。 re #6 我认为你可以在模型定义中定义 getter 来创建适当的虚拟字段。 docs.sequelizejs.com/manual/tutorial/…
    猜你喜欢
    • 2011-06-24
    • 2018-09-21
    • 2013-09-16
    • 1970-01-01
    • 2017-04-15
    • 2023-04-04
    • 2013-09-25
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多