【问题标题】:Node.js multiple Sequelize raw sql query sub queriesNode.js 多个 Sequelize 原始 sql 查询子查询
【发布时间】:2013-09-09 13:00:06
【问题描述】:

标题听起来很复杂。我有一个用户表,每个用户可以有多个兴趣。这些兴趣通过查找表链接到用户。在 PHP 中,我查询了 users 表,然后为每个人做了一个查询以查找兴趣。如何在 Node.js/Sequelize 中执行此操作?我怎样才能建立某种承诺呢?例如:

sequelize.query("SELECT * FROM users").success(function(users) {
    for (var u in users) {
       sequelize.query("SELECT interests.id, interests.title FROM interests, user_interests WHERE interests.id = user_interests.interest_id AND user_interests.user_id = " + users[u].id).success(function(interests) {
       if (interests.length > 0) {
         users[u].interests = interests;
       }
    });
  }
  return users;
});

【问题讨论】:

    标签: javascript node.js sequelize.js


    【解决方案1】:

    从代码底部的 return 语句来看,您似乎还没有完全掌握 node.js 的异步特性。你代码中的return语句将在第一次调用sequelize.query之后直接执行,也就是在查询返回之前。这意味着用户将是未定义的。

    如果你想真正“回馈”用户和他们的兴趣,我建议这样:

    sequelize.query("SELECT * FROM users").success(function(users) {
        done = _.after(users.length, function () {
            callback(users)
        })
    
        for (var u in users) {
            sequelize.query("SELECT interests.id, interests.title FROM interests, user_interests WHERE interests.id = user_interests.interest_id AND user_interests.user_id = " + users[u].id).success(function(interests) {
                if (interests.length > 0) {
                 users[u].interests = interests;
                }
                done();
            });
        }
    });
    

    在上面的代码中_ 指的是一个实用程序库。在调用 users.length 次后执行回调函数。回调是一个传递给你的代码的函数,它应该处理返回结果,例如在网络服务器的上下文中将用户返回给客户端。

    另一条评论 - 如果您只执行原始 SQL 查询,Sequelize 可能不是您的最佳选择。为什么不直接使用 SQL 驱动程序?如果你想使用 sequelize,你应该利用它的特性。尝试使用JOINs / eager loading为用户和兴趣定义模型,建立关联并一次性加载用户和兴趣

    更新:使用承诺的示例

    sequelize.query("SELECT * FROM users").then(function(users) {
      return sequelize.Promise.map(users, function (u) {
        return sequelize.query("SELECT interests.id, interests.title FROM interests, user_interests WHERE interests.id = user_interests.interest_id AND user_interests.user_id = " + users[u].id).then(function(interests) {
          if (interests.length > 0) {
            user.interests = interests;
          }
        });
      });
    });
    

    【讨论】:

    • 记住你必须包含underscore模块
    • _ 已用于sequelize,并通过Sequelize.Utils._公开
    • 嗨 Jan 我在同一个问题上被阻止了好几个小时。我尝试使用 Promise.all 没有任何运气。我是 node.js 的新手,所有异步的东西很可能我一直很困惑,但我想知道你是否有一个使用 Promise.all 的工作示例?谢谢 无论如何,您的回答对我很有帮助。
    • @Etienne 我添加了一个使用承诺的示例
    • @Jan. “有什么理由不直接使用 SQL 驱动程序?”你能解释一下SQL驱动程序吗?我正在使用 sequelize 连接 postres 和 express 并且只执行原始查询/原始多个查询
    猜你喜欢
    • 2015-11-30
    • 2012-06-04
    • 2023-04-01
    • 2016-04-28
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    相关资源
    最近更新 更多