【发布时间】:2016-08-03 20:18:06
【问题描述】:
例如,我想从 db 中获取用户信息、电子邮件和它的角色,并创建一个像这样的对象:
{
"id": 1,
"firstname": "John",
"lastname": "Johnny",
"emails": [
{
"type": "work",
"email": "work@work.com"
},
{
"type": "personal",
"email": "personal@personal.com"
}
],
"roles": [
{
"role": "ADM",
"title": "Admin"
},
{
"role": "PUB",
"title": "Publisher"
}
]
}
我需要查询三个表:
-
Users表有id、firstname、lastname。 -
Emails表有type、email、user_id。 -
Roles表有role、title、user_id。
基于pg-promise 的wiki,我几乎可以肯定必须使用Tasks 来完成,但不确定您将如何链接它们。
更新 在我的实际项目中,我必须插入一个产品并使用生成的 id 来插入属性。在这里添加我的代码以防您遇到类似情况:
//Insert a new product with attribites as key value pairs
post_product_with_attr: function(args) {
return db.task(function(t) {
return t.one(sql.post_new_product, args)
.then(function(dt) {
var queries = [];
Object.keys(args).forEach(function(key) {
queries.push(t.one(sql.post_attr_one, { Id: dt.id, key: key, value: args[key] }));
});
return queries.length ? t.batch(queries) : [dt];
});
});
}
【问题讨论】:
-
当一个查询的参数是前一个查询的结果时,您链接查询,而在您的示例中并非如此。您的示例在查询结果之间没有依赖关系。不需要链接。
-
@vitaly-t,是的,我在这个问题上犯了一个错误。我的实际情况是我有电子邮件,需要先从电子邮件表中获取 user_id。
-
@vitaly-t,我刚刚添加的更新是否看起来不合适,它添加产品并返回 id,但使用调试器我在 pg- 处收到
Loose request outside an expired connection.的异步错误promise/lib/query.js 第 183 行reject(errMsg); -
是的,
(queries > 0)是一段无效的代码。应该是(queries.length > 0),或者简单地说:return queries.length? t.batch(queries) : [dt];。这就是它在那里失败的原因,因为你永远不会执行t.batch(queries)。 -
@vitaly-t,就是这样!谢谢!我什至不确定它最初是怎么变成这样的。大声笑
标签: node.js postgresql express pg-promise