#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
вызове. вы можете «разбить» запрос по мере необходимости (как я сделал во втором примере)