knex two mysql query synchronize using promise


Promise.all(sendData.franchisee.map(row => {
    return  knex('designer.settings').select('value').where({setting_key : 'PRICING_TIER'})
            .then(pricing_tier => {
                row.pricing_tier = pricing_tier[0].value;
                knex('designer.pricing_tier').select('tier_title').where({id : row.pricing_tier})
                .then(tier_title =>{
                    row.tier_title = tier_title[0].tier_title;
                    return row;
                })
            });
})).then(response => {
    cb(sendData);     
});

在承诺"designer.settings"和"designer.pricing_tier"中听到两个查询。当执行"designer.settings"时,我在执行"designer.pricing_tier"后在行中得到该结果,但该输出没有进入行。row.tier_title = tier_title[0].tier_title不在最终发送数据中。如何在一个承诺中同步两个查询?

不确定查询是否真的做完全相同的事情,但这仅演示了如何使用 knex 正确执行上述查询的基本思想。

实际上与加入pricing_tier相同,以防止需要 2 个单独的查询。

Promise.all(
  sendData.franchisee.map(row => {
    return knex('pricing_tier') 
      .withSchema('designer') // <-- selecting schema correctly in knex
      // this join could have been done as a subquery in select too...
      .join('settings', 'settings.setting_key', knex.raw('?', ['PRICING_TIER'])) 
      .select('settings.value', 'pricing_tier.tier_title')
      .where('pricing_tier.id', row.pricing_tier)
      .then(rows => {
        row.pricing_tier = rows[0].value;
        row.tier_title = rows[0].tier_title;
        return row;
      });
  })
).then(response => {
  cb(sendData); // <--- generally bad idea to mix promises and callbacks
});

生成的 SQL 如下所示:

select 
  `settings`.`value`, 
  `pricing_tier`.`tier_title` 
from `designer`.`pricing_tier` 
inner join `designer`.`settings` on `settings`.`setting_key` = 'PRICING_TIER' 
where `pricing_tier`.`id` = 3219
您应该将

两个查询包装到一个承诺中,该承诺仅在两个查询都完成如下作业时解析:

Promise.all(sendData.franchisee.map(row => {
  return  new Promise((resolve) => {
    knex('designer.settings').select('value').where({setting_key : 'PRICING_TIER'})
      .then(pricing_tier => {
        row.pricing_tier = pricing_tier[0].value;
        knex('designer.pricing_tier').select('tier_title').where({id : row.pricing_tier})
          .then(tier_title =>{
            row.tier_title = tier_title[0].tier_title;
            resolve(row);
          })
      });
  });
})).then(response => {
  cb(sendData);
});

相关内容

  • 没有找到相关文章

最新更新