so I've been playing around with knex lately, however I found myself on a situation where I don't know what to do anymore.
so I have this query:
knex.raw("INSERT INTO tablename (`col1`, `col2`, `col3`) VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE col2 = VALUES(`col2`)",
[
['val1', 'hello', 'world'],
['val2', 'ohayo', 'minasan'],
]);
And for some reasons It throws me an error Expected 2 bindings, saw 3
.
I tried making it:
knex.raw("INSERT INTO tablename (`col1`, `col2`, `col3`) VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE col2 = VALUES(`col2`)",
['val1', 'hello', 'world'],
['val2', 'ohayo', 'minasan'],
);
No error this time, but it only inserts the first array.
I also tried making the values an object:
[
{col1: 'val1', col2: 'hello', col3: 'world'},
{col1: 'val2', col2: 'ohayo', col3: 'minasan'},
]
But still no luck.
I wrote this code to insert/update either a single row as an object or multiple rows as an array of objects:
function insertOrUpdate(knex: Knex, tableName: string, data: any) {
const firstData = data[0] ? data[0] : data;
return knex.raw(knex(tableName).insert(data).toQuery() + " ON DUPLICATE KEY UPDATE " +
Object.getOwnPropertyNames(firstData).map((field) => `${field}=VALUES(${field})`).join(", "));
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With