Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在postgres节点中插入空对象数组_Sql_Postgresql - Fatal编程技术网

Sql 在postgres节点中插入空对象数组

Sql 在postgres节点中插入空对象数组,sql,postgresql,Sql,Postgresql,我有一个angular应用程序,用户可以有多个角色 在客户机中,当我向用户删除或添加角色时,我将其作为对象数组发送给nodejs "roles": [ { "role_id": 1, "role_name": "Admin" }, { "role_id": 2,

我有一个angular应用程序,用户可以有多个角色

在客户机中,当我向用户删除或添加角色时,我将其作为对象数组发送给nodejs

"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谢谢你发现了我的错误。我已经更新了我的答案。仅供参考:您可以编辑其他人的答案。将通知作者并给予其接受编辑的选项。祝你的项目好运!