因此,我使用AdonisJS和PostgreSQL作为后端,并试图找到一种方法,通过SQL或使用AdonisJS模型方法,在不执行循环的情况下更新数组中的许多内容。
我有一个像这样的数组(不。项的数量不确定):
[
{
"id":5,
"name":"aaaaaaa",
"price":"5689.78",
},
{
"id":6,
"name":"bbbbb",
"price":"5689.78",
},
{
"id":7,
"name":"cccc",
"price":"5689.78",
}
]假设我有一个名为products的表
发布于 2020-04-20 15:41:32
所以我最终让它起作用了,我使用了一个带有ON冲突子句的INSERT查询
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语句创建了一个查询
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"
)发布于 2022-01-22 21:56:13
您可以使用清晰的透视图。
const Product = use('App/Models/Product')
const productData = request.collect(['id', 'name', 'price'])
await Product.createMany(productData)
createMany方法使查询的行数为n,而不是执行批量插入,其中n是行数。
或者,您可以使用此代码进行批量插入。您必须显式定义返回列。
await Database
.insert(array)
.into('products')
.returning('id')https://stackoverflow.com/questions/61314721
复制相似问题