Sql 在postgres节点中插入空对象数组
我有一个angular应用程序,用户可以有多个角色 在客户机中,当我向用户删除或添加角色时,我将其作为对象数组发送给nodejsSql 在postgres节点中插入空对象数组,sql,postgresql,Sql,Postgresql,我有一个angular应用程序,用户可以有多个角色 在客户机中,当我向用户删除或添加角色时,我将其作为对象数组发送给nodejs "roles": [ { "role_id": 1, "role_name": "Admin" }, { "role_id": 2,
"roles": [
{
"role_id": 1,
"role_name": "Admin"
},
{
"role_id": 2,
"role_name": "Moderator"
}
],
我的问题是:
for (i in roles) {
db.query(`
INSERT INTO user_roles (role_id, user_id)
VALUES($1, $2)
ON CONFLICT (role_id, user_id)
DO UPDATE
SET
role_id = $1,
user_id = $2`,
[roles[i].role_id, user_id], (err, data) => {
if (err) {
console.log(err)
} else {
console.log('inserted/deleted role')
}
})
}
现在,有两个问题:
1-创建用户时,用户开始时没有角色,并且正在传递对象的null
数组roles:[null]
,这将中断查询,因为role.role\u id为null
2-如果要删除角色,我将传递以下消息,但如何在查询中添加要删除对象数组中不存在的角色
"roles": [
{
"role_id": 1,
"role_name": "Admin"
},
//the role moderator is removed from client so it's not being passed
],
我看到您采用了多对多的方法:-) 正如PostgreSQL可以为您将查询结果转换为json一样,它可以与您传递到数据库的json一起工作。再一次,我会要求数据库为您处理这个问题 不要在javascript中循环,试试这样的方法。这有点冗长,但一旦理解了各个部分,就应该更容易理解了
db.query(`
WITH invars AS ( -- pass your parameter values only once
SELECT $2::INT as user_id, $1::JSONB as jdata
), newroles as ( -- expand to all valid role_id values, if none, then role_id will be null
SELECT user_id, (el->>'role_id')::INT as role_id
FROM invars
CROSS JOIN LATERAL JSONB_ARRAY_ELEMENTS(jdata) AS j(el)
), do_delete AS ( -- delete any existing user_roles that should not exist
DELETE FROM user_roles
USING invars
WHERE invars.user_id = user_roles.user_id
AND NOT EXISTS (SELECT 1
FROM newroles
WHERE role_id = user_roles.role_id)
) -- finally insert user_roles that do not exist
INSERT INTO user_roles (role_id, user_id)
SELECT role_id, user_id
FROM newroles n
WHERE role_id IS NOT NULL
AND NOT EXISTS (SELECT 1
FROM user_roles
WHERE (role_id, user_id) = (n.role_id, n.user_id))`,
[JSON.stringify(roles), user_id], (err, data) => {
if (err) {
console.log(err)
} else {
console.log('inserted/deleted role')
}
})
传递空数组,而不是包含
NULL
值的数组。他们不是一回事。噢,嘿,迈克!你抓住我了:-)。是的,我确实考虑过你所说的灵活性,并按照你的方式去做。谢谢,我想它现在可以工作了,但是我已经添加了:并且角色id不是空的。因为我从索引0处的Angular得到一个空值,这导致了一些问题(非空约束)。我真的很感谢你的帮助,迈克:-)@MG91谢谢你发现了我的错误。我已经更新了我的答案。仅供参考:您可以编辑其他人的答案。将通知作者并给予其接受编辑的选项。祝你的项目好运!