Чтобы я наконец заработал, я использовал запрос INSERT с предложением ON CONFLICT
await Database.raw(
"INSERT INTO products (id, name, price) " +
"VALUES (5, 'aaaaaaa', 5689.78), (6, 'bbbbb', 5689.78), (7, 'cccc', 5689.78) " +
"ON CONFLICT (id) " +
"DO UPDATE SET " +
"name = EXCLUDED.name, " +
"category_id = EXCLUDED.category_id, " +
"price = EXCLUDED.price, " +
"units = EXCLUDED.units, " +
"priority = EXCLUDED.priority, " +
"is_hidden = EXCLUDED.is_hidden"
)
Для его динамического обновления я дам этот пример кода
const requestPayload = [
{
"id":5,
"name":"aaaaaaa",
"price":"5689.78",
},
{
"id":6,
"name":"bbbbb",
"price":"5689.78",
},
{
"id":7,
"name":"cccc",
"price":"5689.78",
}
]
// create a string that translate the request payload
// to this format = "(5, 'aaaaaaa', 5689.78), (6, 'bbbbb', 5689.78), (7, 'cccc', 5689.78)"
const values = requestPayload.reduce((result, item) => {
const itemKeys = ['id', 'name', 'price']
// create a string that translate the product item obj
// to this format (4, 'aaaa', 111)
const productValues = itemKeys.reduce((res, productKey) => {
const productValue = item[productKey]
if (productKey === 'name') {
res.push(`'${productValue}'`)
return res
}
res.push(`${productValue}`)
return res
}, []).join(', ')
result.push(`( ${productValues} )`)
return result
}, []).join(', ')
await Database.raw(
"INSERT INTO products (id, name, price) " +
"VALUES " + values +
"ON CONFLICT (id) " +
"DO UPDATE SET " +
"name = EXCLUDED.name, " +
"category_id = EXCLUDED.category_id, " +
"price = EXCLUDED.price, " +
"units = EXCLUDED.units, " +
"priority = EXCLUDED.priority, " +
"is_hidden = EXCLUDED.is_hidden"
)
Я чувствую, что должен быть лучший ответ, используя оператор UPDATE вместо оператора INSERT, поэтому, если у вас есть лучший ответ, пожалуйста, ответьте на этот вопрос!
UPDATE:
Я сейчас создал запрос с использованием оператора UPDATE
await Database.raw(
"UPDATE products " +
"SET " +
"name = prod.name, " +
"price = prod.price, " +
"FROM " +
"( VALUES (5, 'aaaaaaa', 5689.78), (6, 'bbbbb', 5689.78), (7, 'cccc', 5689.78) ) as prod (id, name, price) " +
"WHERE products.id = prod.id"
)