gpt4 book ai didi

javascript - pg-promise task and map with multiple same level nested queries

转载 作者:搜寻专家 更新时间:2023-10-31 23:51:44 25 4
gpt4 key购买 nike

我正在使用 node 和 pg-promise 创建一个基本的 rest API,但在查询特定用户的所有数据时遇到了一些问题。下面是返回的数据应该是什么样子。地址、电话号码和技能都位于单独的表中。我在检索地址或电话号码时没有问题,这是我似乎无法掌握的技能。不太确定如何在让用户获得所有这些其他字段的主查询之后进行多个查询,请参阅随附的代码以供引用,我很乐意回答任何问题。


{
"user_id": 1,
"first_name": "Eugene",
"last_name": "Hanson",
"display_name": "Eugene Hanson",
"email": "ehanson0@typepad.com",
"hash": "88a6aa27235d2e39dd9cb854cc246487147050f265578a3e1aee35be5db218ef",
"privilege_id": 14,
"seniority": 1,
"birthday": "19-11-1940 00:00:00.0",
"shift_count_total": 587,
"shift_count_year": 62,
"address_id": 1,
"street": "92 Schmedeman Lane",
"city": "Fort Smith",
"state": "AR",
"zip": 72905,
"phone_numbers": [
{
"phone_number": "62-(705)636-2916",
"name": "PRIMARY"
}
],
"skills": [
"Head Audio",
"Head Video",
"Head Electrician",
"Carpenter",
"rigger"
]
}

    function getAllUsers() {
// console.time("answer time")
var deferred = Q.defer();
db.task(t => {
return t.map('SELECT * \
FROM users \
JOIN addresses \
ON users.address_id = addresses.address_id',[], user => {
var user_id = user.user_id;
// console.log(user_id)
console.time("answer time")
return t.manyOrNone('SELECT phone_numbers.phone_number, phone_types.name \
FROM users \
JOIN users_phone_numbers \
ON users.user_id = users_phone_numbers.user_id \
JOIN phone_numbers \
ON users_phone_numbers.phone_id = phone_numbers.phone_id \
JOIN phone_types \
ON phone_numbers.phone_type_id = phone_types.phone_type_id \
WHERE users.user_id = $1', user.user_id)
.then(phone_numbers=> {
// logger.log('info', phone_numbers)
user.phone_numbers = phone_numbers;
return user;
})
}).then(t.batch);
})
.then(data => {
// console.log(data)
console.timeEnd("answer time");
var response = {code: "200",
message: "",
payload: data};
deferred.resolve(response);
})
.catch(error => {
var response = {code: error.code,
message: error.message,
payload: ""};
logger.log('error', error)
deferred.reject(response)
});

最佳答案

我是 pg-promise 的作者.


您的函数的简化版本为:

function getAllUsers() {
return db.task(t => {
return t.map('SELECT * FROM users', [], user => {
return t.batch([
t.any('SELECT * FROM phones'), // plus formatting params
t.any('SELECT * FROM skills'), // plus formatting params
])
.then(data => {
user.phones = data[0];
user.skills = data[1];
return user;
});
}).then(t.batch);
});
}

getAllUsers()
.then(data => {
// data tree
})
.catch(error => {
// error
});

如果您使用的是 bluebird作为 promise 库,那么您可以替换此代码:

.then(data => {
user.phones = data[0];
user.skills = data[1];
return user;
});

用这个:

.spread((phones, skills) => {
user.phones = phones;
user.skills = skills;
return user;
});

并且不要使用像 var deferred = Q.defer(); 这样的东西,那里不需要它。该库已经是基于 promise 的。

有关高性能替代方案,请参阅:get JOIN table as array of results with PostgreSQL/NodeJS .

关于javascript - pg-promise task and map with multiple same level nested queries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43200483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com