2016-07-29 9 views
7

ich eine Upsert Abfrage in PostgreSQL haben mag:Upsert in KnexJS

INSERT INTO table 
    (id, name) 
values 
    (1, 'Gabbar') 
ON CONFLICT (id) DO UPDATE SET 
    name = 'Gabbar' 
WHERE 
    table.id = 1 

I Knex dieser Upsert Abfrage verwenden müssen. Wie geht das?

Antwort

4

So löste ich diese folgenden Vorschlag von Dotnil's answer on Knex Issues Page mit:

var data = {id: 1, name: 'Gabbar'}; 
var insert = knex('table').insert(data); 
var dataClone = _.cloneDeep(data); 

delete dataClone.id; 

var update = knex('table').update(dataClone).whereRaw('table.id = ' + data.id); 
var query = util.format('%s ON CONFLICT (id) DO UPDATE SET %s', 
    insert.toString(), 
    update.toString().replace(/^update\s.*\sset\s/i, '') 
); 

return knex.raw(query) 
.then(function(dbRes){ 
    // stuff 
}); 

Hope this jemand hilft.

+0

Von @HasFiveVowels Link reden sie viel darüber, wie die Verwendung von toString-Methode wird nicht helfen, SQL-Injektionen zu verhindern. Ich frage mich, ob die formatierte Zeichenfolge anders ist? Andernfalls könnten Sie überlegen, einen besseren Switch zu erstellen oder Ihre Antwort zu aktualisieren. – ArchNoob

1

Ich habe eine Funktion dafür und described it on the knex github issues page (zusammen mit einigen der Probleme für den Umgang mit zusammengesetzten eindeutigen Indizes) erstellt.

+0

Während Ihr Link wirklich hilft, wäre es besser, wenn Sie auch hier eine Antwort geben würden. Vielen Dank. – ArchNoob