【问题标题】:Get Resultset From Query without Meta Information Sequelize从没有元信息的查询中获取结果集 Sequelize
【发布时间】:2016-09-05 08:10:36
【问题描述】:

我是 Node.js/Sequelize.js 的新手。我有以下查询代码:

var agent_list =  models.agent.findAll({
                                      subQuery: false,
                                      where:   qry_filter,
                                      attributes: select_attributes,
                                      include:include_models,
                                      group: ['agent_id'],
                                      order: agent_data.sort || appConfig.DEFAULT_AGENT_SORT,
                                      limit: agent_data.num_results || appConfig.DEFAULT_RESPONSE_SIZE

                                    })

                                   .then(function(agent_list){

                                      console.log(agent_list);

                                   });

语句“console.log(agent_list)”打印从 db 检索到的数据以及诸如 options:{...} 、 modelOptions: {...} 等元信息。dataValues 对象包含我想要的数据。结果集是嵌套的 js 对象,每个对象都具有相同的结构,因此很难遍历结果集并仅获取 dataValues。

我有使用 PHP 的经验 $db -> Execute("$qry") 将返回带有元数据的结果集并获取行 $db -> Execute("$qry")->getRows() 可以使用。如何在sequelize中实现这一点?

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    您可以使用一个名为 sequelize-values 的 npm 包。

    所以在你的情况下,你的代码是

    models.agent.findAll({
        subQuery: false,
        where: qry_filter,
        attributes: select_attributes,
        include: include_models,
        group: ['agent_id'],
        order: agent_data.sort || appConfig.DEFAULT_AGENT_SORT,
        limit: agent_data.num_results || appConfig.DEFAULT_RESPONSE_SIZE
    }).then(function(agent_list) {
        return agent_list.map(function(agent) {
            return agent.getValues();
        });
    }).then(function(agent_list) {
        console.log(agent_list);
    });
    

    【讨论】:

    • 我已经通过一些修改实现了您的解决方案。 then(function(agent_list){ agent_list.map(function(agent) { console.log(agent.getValues()); }); }); 效果很好。正是我需要的。
    • 好吧,如果您只想记录它们,也许您应该考虑使用 forEach。 Map 函数实际上希望您返回一些作为 map 操作的结果
    • 我发现字符串化然后解析来自 sequelize 的 JSON 结果与 sequelize-values 模块的效果相同。 JSON.parse(JSON.stringify(results))
    【解决方案2】:

    Sequelize 不使用结果集或行等概念。它是一个 ORM,因此行(包括嵌套关联)被视为具有嵌套对象的对象。它还应用了“活动记录”模式,因此每个返回的对象都添加了其他方法,例如“保存”、“更新”、“删除”等等。

    当 Sequelize 实例被序列化为 JSON 时,它们会剥离所有 Sequelize “元数据”属性并只返回简单的对象,正如您所期望的那样。

    此外,Sequelize 实例使用属性 getter 和 setter 来透明地表现得像简单的 JS 对象。这意味着您可以执行agent_list[0].myProperty = 1; console.log(agent_list[0].myProperty); 之类的操作,它的行为将与您预期的一样。这样做的原因是它可以跟踪更新的值,因此以后的“更新”调用只会更新已更改的列。

    您应该不需要手动从查询结果中获取“行”。

    【讨论】:

    • Yes toJSON 会去除所有元信息,但在转换为 JSON 之前我需要对结果进行进一步处理。我在表中有 95 列。为每个属性调用get方法太麻烦了。
    • 我的意思是,您不需要显式调用 .get() 或 .toJSON() 来处理任何内容。您可以将每个对象(行)的属性(列)映射到所需输出对象的属性。例如。 var output = { outProp: input.columnA + input.columnB);,其中“输入”是 Sequelize 模型(行)的一个实例。
    • 我目前正在做的是 findAll 返回所有数据行+元数据。我在 toJSON 方法中使用 _.omit() 来省略我不需要响应的列。然后如上面的答案建议我使用 sequelize-values 来映射输出。这是一个不好的做法吗?我还在学习node.js/sequelize.js
    猜你喜欢
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多