Skip to content

Instantly share code, notes, and snippets.

@Kostanos
Created May 23, 2021 09:37
Show Gist options
  • Save Kostanos/2c12029a3d917d26c2333463016a62bc to your computer and use it in GitHub Desktop.
Save Kostanos/2c12029a3d917d26c2333463016a62bc to your computer and use it in GitHub Desktop.
Knex Postgress ON CONFLICT (ON DUPLICATE KEY) insert
// Inspired by https://github.com/knex/knex/issues/701#issuecomment-314818463
// Will converts also CamelCase fields to SnakeCase
const knex = require('./pgAdaptor');
const camelToSnakeCase = str => str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
function insertOrUpdate(tableName, data, conflictKey) {
const updateTxt = Object.getOwnPropertyNames(data)
.filter(f => f !== conflictKey)
.map(field => `${camelToSnakeCase(field)}=:${field}`).join(', ');
return knex.raw(`
${knex(tableName).insert(data).toQuery()}
ON CONFLICT (${conflictKey}) DO UPDATE
SET
${updateTxt}
`, data);
}
module.exports = insertOrUpdate;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment