Node.js Sequelize.js-如何正确使用关联的get方法(每次调用都没有sql查询)?

Node.js Sequelize.js-如何正确使用关联的get方法(每次调用都没有sql查询)?,node.js,orm,sequelize.js,Node.js,Orm,Sequelize.js,我正在为ORM使用Sequelize.js,并且有一些关联(现在这实际上并不重要)。我的模型从这些关联中获取get和set方法。像这样(来自文档): 现在,我有了Project.getUser(),它返回了一个承诺。但如果对同一个对象调用两次,就会执行两次SQL查询 我的问题是——我是遗漏了什么,还是这是一种预期的行为?实际上,我不想在每次对该对象调用相同的方法时进行额外的查询 如果这是预期的-我是否应该使用自定义getter和成员变量,手动填充并返回(如果存在)?还是有更聪明的东西?:) 更新

我正在为ORM使用Sequelize.js,并且有一些关联(现在这实际上并不重要)。我的模型从这些关联中获取
get
set
方法。像这样(来自文档):

现在,我有了
Project.getUser()
,它返回了一个承诺。但如果对同一个对象调用两次,就会执行两次SQL查询

我的问题是——我是遗漏了什么,还是这是一种预期的行为?实际上,我不想在每次对该对象调用相同的方法时进行额外的查询

如果这是预期的-我是否应该使用自定义getter和成员变量,手动填充并返回(如果存在)?还是有更聪明的东西?:)

更新 根据调试器的回答,我知道我可以在进行查询时使用
includes
,以便快速加载所有内容,但我根本不需要它,也不能一直这样做。如果我一开始就加载整个数据库,只是为了理解(根据某些标准)我不需要它,那将是资源的浪费和巨大的开销。我想根据情况提出其他问题。但是我也不能破坏我拥有的所有模型(DAO对象)并创建新的模型,其中包含所有的信息。我应该能够更新它们中缺少的部分(从关系中)。

如果使用getUser()它将进行查询调用,它不会让您访问该用户。您可以手动将其保存到project.user或project.users,具体取决于关联

但是你可以尝试一下

Project.find({
  include: [
    { model: User, as: 'user' } // here you HAVE to specify the same alias as you did in your association
  ]
}).success(function(project){
project.user // contains the user

});
也可以是例如getUser()。不要指望它会自动缓存用户,也不要聪明地覆盖它,因为它会产生副作用。getUser应该从数据库中获取,并且应该

Project.getUser().then(function(user){
   // user is available and is a sequelize object
   project.user = user; // save project.user and use it till u want to
})

第一部分很清楚-每次调用
get[Association]
(例如
Project.getUser()
都会导致数据库查询

Sequelize不为结果维护任何类型的状态或缓存。您可以在预期的通话结果中获得
user
,但如果您再次需要,则必须进行另一次查询

@DeBuGGeR所说的-关于使用访问器的话也不正确-访问器仅在查询后立即出现,并且不会被保留

由于有时这是不好的,您必须自己实现某种缓存系统。下面是棘手的部分:

如果您想使用相同的get方法
Project.getUser()
,您将无法这样做,因为Sequelize会覆盖您的
instanceMethods
。例如,如果您具有上述关联,则此将不起作用

instanceMethods: {
    getUser: function() {
        // check if you have it, otherwise make a query
    }
}
有几种可能的方法来修复它——要么稍微更改Sequelize core(首先检查该方法是否存在),要么对这些函数使用某种包装器

有关这方面的更多详细信息,请参见:


感谢您在如何理解该做什么方面的合作:)

不理解您的第二部分。很明显,我想以应该使用的方式使用ORM——直接使用模型。我得到这个项目,然后从不同的地方(文件)开始使用它。在其中的许多方面,我想检查是否有用户。因为我有关联,我最终使用了
getUser
。当然,我不想每次都查询数据库!我不明白为什么每次都要从数据库中获取如果我必须包装orm模型以保存状态变量,那么这不是真正的orm:)访问它的正确方法是“project.user”。getUser是sql查询的包装器。你想在两者之间有一个缓存吗?如果(!project.user)返回project.getUser();可以作为一个!sequelize是一款很棒的ORM:)绝对是让你的生活更轻松的一款。只是不要混合使用访问器和查询方法。嗯,如果我们转到上一个示例,这是不起作用的:
Project.getUser()。然后(function(){Project.User;//undefined}
;edit-请不要误解Sequelize-我只需要知道它实际上是如何工作的(我希望它能正常工作)我必须至少调用一次这段代码,以确保它已经从DB更新。我在哪里调用它呢?在我的自定义实例方法中,我想……)
instanceMethods: {
    getUser: function() {
        // check if you have it, otherwise make a query
    }
}