#knex.js
Вопрос:
Я делаю обновление в postgres, используя knex, и в случае конфликта (и последующего обновления) Я хочу обновить конфликтующую строку только в том случае, если существующее значение в столбце (метка времени) меньше входящего значения.
await dbClient(table)
.insert(records)
.onConflict("digits")
.merge();
Я хочу, чтобы слияние произошло, если поле act_ts (метка времени) в отдельной записи (из массива записей) больше, чем существующее значение столбца.
Я пробовал следующий код
await dbClient(table)
.insert(records)
.onConflict("digits")
.merge().where('act_ts','<',???);
Как мне ссылаться на значение во входящем объекте, чтобы сравнить его с ним?
Ответ №1:
После изучения документации PostgreSQL я обнаружил, что есть зарезервированное слово «ИСКЛЮЧЕНО», которое ссылается на строку данных, которая конфликтовала, поэтому я сделал следующее:
const response = await dbClient(table)
.insert(records)
.onConflict("digits")
.merge().whereRaw(`${table}.act_ts < EXCLUDED.act_ts`);
Где ${table}.act_ts
ссылается на данные, уже содержащиеся в таблице, и EXCLUDED.act_ts
входящее значение.
Работает, как и ожидалось.