Условно обновленные записи в knex

#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 входящее значение.

Работает, как и ожидалось.