2016-07-29 14 views
7

Tôi có một truy vấn upsert trong PostgreSQL thích:Upsert trong KnexJS

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

tôi cần phải sử dụng knex để truy vấn upsert này. Làm thế nào để đi về điều này?

Trả lời

4

Vì vậy, tôi giải quyết này bằng cách sử dụng gợi ý sau đây từ Dotnil's answer on Knex Issues Page:

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 helps một ai đó.

+0

Từ liên kết @HasFiveVowels, họ nói rất nhiều về cách sử dụng phương pháp toString sẽ không giúp ngăn ngừa tiêm sql. Tôi tự hỏi liệu chuỗi định dạng có khác biệt không? Nếu không, bạn có thể xem xét thực hiện chuyển đổi tốt hơn hoặc cập nhật câu trả lời của mình. – ArchNoob

1

Tôi đã tạo một chức năng để thực hiện việc này và described it on the knex github issues page (cùng với một số dấu hiệu để xử lý các chỉ mục tổng hợp duy nhất).

+0

Trong khi liên kết của bạn thực sự hữu ích, sẽ tốt hơn nếu bạn chia sẻ câu trả lời tại đây. Cảm ơn. – ArchNoob