Я использую 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"
}
}
Все вышеперечисленные поля должны быть включены в таблицу «твиты» кроме хэштегов, которые, в свою очередь, должны быть включены в таблицу «хэштеги».
Вот код, который я использую на основе вложенных транзакций из документации pg-promise внутри модуля NodeJS. Я предполагаю, что мне нужны вложенные транзакции, потому что мне нужно знать как tweet_id
, так и hashtag_id
, чтобы связать их в таблице хэштегов.
// 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);
});
})
}
Проблема в том, что с этим кодом я могу успешно вставить твит, но тогда ничего не происходит. Я не могу вставить хэштеги или связать хэштег с твитами.
Извините, но я новичок в кодировании, поэтому, думаю, я не понял, как правильно вернуться из транзакции и как выполнить эту простую задачу. Надеюсь, вы можете мне помочь.
Заранее спасибо.
Жан