knex 两个 mysql 查询使用 promise 同步
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 不在最终发送数据中。
如何在一个承诺中同步两个查询?
您应该将这两个查询包装到一个承诺中,该承诺仅在两个查询都完成工作时才解析,如下所示:
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);
});
不确定查询是否确实执行完全相同的操作,但这只是演示了如何使用 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 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 不在最终发送数据中。 如何在一个承诺中同步两个查询?
您应该将这两个查询包装到一个承诺中,该承诺仅在两个查询都完成工作时才解析,如下所示:
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);
});
不确定查询是否确实执行完全相同的操作,但这只是演示了如何使用 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