私は、pg-promiseライブラリの作者hereが推奨するパフォーマンスパターンに従おうとしています。Pg-promiseパフォーマンスの向上:オンコンフリクト
は、基本的にはヴィタリーは、インサートをそうすることをお勧めします。
var users = [['John', 23], ['Mike', 30], ['David', 18]];
// We can use Inserts as an inline function also:
db.none('INSERT INTO Users(name, age) VALUES $1', Inserts('$1, $2', users))
.then(data=> {
// OK, all records have been inserted
})
.catch(error=> {
// Error, no records inserted
});
次ヘルパー関数を使う:挿入時にcontraintがあるとき
function Inserts(template, data) {
if (!(this instanceof Inserts)) {
return new Inserts(template, data);
}
this._rawDBType = true;
this.formatDBType = function() {
return data.map(d=>'(' + pgp.as.format(template, d) + ')').join(',');
};
}
私の質問は、どのように行くだろうか? 私のコードは:私は非同期ループの外だから
db.tx(function (t) {
return t.any("SELECT... ",[params])
.then(function (data) {
var requestParameters = [];
async.each(data,function(entry){
requestParameters.push(entry.application_id,entry.country_id,collectionId)
});
db.none(
" INSERT INTO application_average_ranking (application_id,country_id,collection_id) VALUES ($1)" +
" ON CONFLICT ON CONSTRAINT constraint_name" +
" DO UPDATE SET country_id=$2,collection_id=$3",
[Inserts('$1, $2, $3',requestParameters),entry.country_id,collectionId])
.then(data=> {
console.log('success');
})
.catch(error=> {
console.log('insert error');
});
});
});
もちろん、私はパラメータにアクセスすることはできません。
また、私はこのような何か実行しようとしました:
db.none(
" INSERT INTO application_average_ranking (application_id,country_id,collection_id) VALUES ($1)" +
" ON CONFLICT ON CONSTRAINT constraint_name" +
" DO UPDATE SET (application_id,country_id,collection_id) = $1",
Inserts('$1, $2, $3',requestParameters));
をしかし、もちろん、それはPostgreSQLの標準を尊重していません。
これを達成する方法はありますか?
ありがとうございます!
私が提供したコードを実行しようとしていますが、さらに多くのパラメータがあるため、クラッシュします。私は成功するとあなたに知らせるでしょう。あなたの助けにお返事ありがとうございます。 – Stanislasdrg
これらのヘルパーは、有効なクエリを生成する際に非常に正確です。そのうちの1人がエラーを投げている場合、理由があるはずです。私は各エラーに詳細を書きましたので、問題が本当に何であるか見ることができるはずです; –
ああ、私はあなたの[code](https://github.com/vitaly-t/pg) -promise/blob/master/lib/helpers/methods/insert.js):-)私は現在、悪名高い "Invalid insert object in index 0"というエラーがあります。私はなぜチェックしている! – Stanislasdrg