以下是有关在决定是否使用sequelize(sequelize project site)支持的功能之前要解决的一些问题:

  • 链接(效率):链接多个查询时,这些查询是收集到一个对数据库的请求中(作为一批操作),还是每个单独发送?
  • 链接(成功/错误):链接多个查询时,何时发出成功事件,发生错误时会发生什么?仅在所有操作成功后才发出“成功”消息吗?并且如果有错误,它会回滚所有操作(即链式操作是否被视为事务)
  • 过滤关联:假设Crowd对象的关系为Crowd.hasMany(Person)。您可以通过执行crowd.getPersons()来获取所有关联的人,但是是否可以选择其中的一个子集,例如crowd.getPersons({where: { age: 30 }})呢?
  • 通过两个或更多步骤获取相关的关联对象:说一个Crowd对象,关系为Crowd.hasMany(Person),而Person具有关系Person.hasMany(Pet)。是否可以通过执行crowd.getPersons().getPets()之类的方法来获得人群中所有的宠物,如果可以的话,这会作为多个请求发送到数据库,还是只是一个请求?
  • “深层”对象:我想将一个人定义为对象:
    sequelize.define('Person', {
        name: {
            first: <a string>,
            last: <a string>
        }
    });
    

    可以吗? (请注意,名称将不会是数据库表的列,但第一个和最后一个将是)
  • “已计算”对象:是否可以向从对象的其他字段计算出的字段添加字段?例如:
    sequelize.define('Person', {
        name: {
            first: <a string>,
            last: <a string>,
            full: <name.first + ' ' + name.last> // <-- this field
        }
    });
    

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

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

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

    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
        }
      }
    })
    

    09-15 17:44