Как игнорировать обновление столбца, если оно не существует с помощью knex?

#node.js #postgresql #sql-update #knex.js

#node.js #postgresql #sql-обновление #knex.js

Вопрос:

Я пытаюсь обновить таблицу, используя этот синтаксис

 knex(tableName)
.where("id", "=", userId)
.update({
  [payment]: userPayment,
  exampleColumn: userInput,
})
.then((_result) => {console.log(_result);})
.catch(err => console.error(err))
  

теперь exampleColumn может существовать в некоторых таблицах или нет, поэтому я нахожусь в ситуации, когда я хочу сделать эту динамику максимально возможной

существует ли синтаксис, равный этому

 .update({
  [payment]: userPayment,
  exampleColumn?: userInput, // ? to update if exist if not ignore this line
})
  

в качестве обхода я добавил условие в свой код

 if (!isExampleColumn) {  /* I get this from a another function */
  userInput = undefined;
}

knex(tableName)
.where("id", "=", userId)
.update({
  [payment]: userPayment,
  exampleColumn: userInput, // if userInput is undefined then it will be ignored
})
.then((_result) => {console.log(_result);})
.catch(err => console.error(err))
  

но я думаю, что есть лучшее решение, чем это.

Ответ №1:

Вы можете использовать условный разброс, он выглядит так:

 knex(tableName)
  .where("id", "=", userId)
  .update({
    [payment]: userPayment,
    ... isExampleColumn? {exampleColumn: userInput} : {},
  })
  .then((_result) => {console.log(_result);})
  .catch(err => console.error(err))
  

Поскольку Knex является сборщиком запросов, вы также можете разделить «строительные» части.

 const query = knex(tableName)
.where("id", "=", userId)
.update({
  [payment]: userPayment,
});

if(isExampleColumn) {
  query.update({exampleColumn: userInput})
}

const results = query
  .then((_result) => {console.log(_result);})
  .catch(err => console.error(err))

  

Комментарии:

1. выполняет ли второе решение запрос 3 раза в БД, сначала для создания запроса, второй — результат и, наконец, если isExampleColumn, он снова обновится? это правильно? и первое решение точно выполняет условие if, но с троичными операторами?

2. Первый делает if троичным, второй — тот же запрос. Knex — это конструктор запросов, который выполняет запрос к БД только при then вызове. вы можете «разбить» запрос по мере необходимости (как я сделал во втором примере)