我正在使用 NodeJS、PostgreSQL 和令人惊叹的pg-promise库。就我而言,我想执行三个主要查询:
- 在“tweets”表中插入一条推文。
- 如果推文中有主题标签,请将它们插入另一个表“主题标签”
- 他们在第三个表“hashtagmap”(多对多关系表)中链接推文和主题标签
以下是请求正文 (JSON) 的示例:
{
"id":"12344444",
"created_at":"1999-01-08 04:05:06 -8:00",
"userid":"@postman",
"tweet":"This is the first test from postman!",
"coordinates":"",
"favorite_count":"0",
"retweet_count":"2",
"hashtags":{
"0":{
"name":"test",
"relevancetraffic":"f",
"relevancedisaster":"f"
},
"1":{
"name":"postman",
"relevancetraffic":"f",
"relevancedisaster":"f"
},
"2":{
"name":"bestApp",
"relevancetraffic":"f",
"relevancedisaster":"f"
}
}
除了主题标签之外,上述所有字段都应包含在“tweets”表中,而这些字段又应包含在“hashtags”表中。
这是我基于 NodeJS 模块内的 pg-promise 文档中的嵌套事务使用的代码。我想我需要嵌套事务,因为我需要知道这两者tweet_id
并且hashtag_id
为了将它们链接到 hashtagmap 表中。
// Columns
var tweetCols = ['id','created_at','userid','tweet','coordinates','favorite_count','retweet_count'];
var hashtagCols = ['name','relevancetraffic','relevancedisaster'];
//pgp Column Sets
var cs_tweets = new pgp.helpers.ColumnSet(tweetCols, {table: 'tweets'});
var cs_hashtags = new pgp.helpers.ColumnSet(hashtagCols, {table:'hashtags'});
return{
// Transactions
add: body =>
rep.tx(t => {
return t.one(pgp.helpers.insert(body,cs_tweets)+" ON CONFLICT(id) DO UPDATE SET coordinates = "+body.coordinates+" RETURNING id")
.then(tweet => {
var queries = [];
for(var i = 0; i < body.hashtags.length; i++){
queries.push(
t.tx(t1 => {
return t1.one(pgp.helpers.insert(body.hashtags[i],cs_hashtags) + "ON CONFLICT(name) DO UPDATE SET fool ='f' RETURNING id")
.then(hash =>{
t1.tx(t2 =>{
return t2.none("INSERT INTO hashtagmap(tweetid,hashtagid) VALUES("+tweet.id+","+hash.id+") ON CONFLICT DO NOTHING");
});
});
}));
}
return t.batch(queries);
});
})
}
问题在于这段代码我能够成功插入推文,但没有任何反应。我无法插入主题标签,也无法将主题标签链接到推文。
对不起,但我是编码新手,所以我想我不明白如何从交易中正确返回以及如何执行这个简单的任务。希望您能够帮助我。
先感谢您。
让