Javascript 使用';跳过';多行更新中的选项
我是NodeJs新手,尝试使用NodeJs对我的PG数据库执行所有请求。 我希望能够动态更新列,这意味着有时我将只更新一行的两列,有时我将更新所有列,等等。。。 我的输入将是JSON 因为我希望端点能够更新多行,所以我尝试使用带有名称空间的helpers 以下是我的Javascript代码(灵感来自前面的stackoverflow答案): 以下是我正在向端点馈送的JSON:Javascript 使用';跳过';多行更新中的选项,javascript,node.js,postgresql,express,pg-promise,Javascript,Node.js,Postgresql,Express,Pg Promise,我是NodeJs新手,尝试使用NodeJs对我的PG数据库执行所有请求。 我希望能够动态更新列,这意味着有时我将只更新一行的两列,有时我将更新所有列,等等。。。 我的输入将是JSON 因为我希望端点能够更新多行,所以我尝试使用带有名称空间的helpers 以下是我的Javascript代码(灵感来自前面的stackoverflow答案): 以下是我正在向端点馈送的JSON: [{ "id" : 25, "firstname": "Step
[{
"id" : 25,
"firstname": "Stephen",
"surname": "Harrison",
"yob": 1991,
"defensive_skill": 5,
"offensive_skill": 3,
"login": "harry",
"password": "123456"
},
{
"id": 26,
"firstname": "Chris",
"surname": "Jackson",
"defensive_skill": 5,
"offensive_skill": 4,
"login": "chris",
"password": "123456"
}
]
下面是错误:
Property 'yob' doesn't exist.
如您所见,在数组的第二个对象中,我没有指定字段“yob”。
我希望对于第二个对象,除了“yob”之外,所有列都会更新。
有什么地方我做错了吗?它不起作用的原因是
跳过
逻辑只能用于单行更新,如下所示:
由方法update
(针对单个对象)使用
多行更新语法不允许任何跳过逻辑,因此当缺少属性时,需要提供默认值,如下所示:
{name: 'yob', skip, def: defaultValue}
defaultValue
可以是上面的任何内容,包括未定义的
或者,您可以使用属性init
,动态返回值
因此,在上面的代码中,如果将列声明更改为:
{name: 'yob', skip, def: null}
您的更新
呼叫将生成:
UPDATE "players" AS t SET "firstname"=v."firstname","surname"=v."surname","yob"=v."yob","defensive_skill"=v."defensive_skill","offensive_skill"=v."offensive_skill","login"=v."login","password"=v."password" FROM (VALUES(25,'Stephen','Harrison',1991,5,3,'harry','123456'),(26,'Chr
is','Jackson',null,5,4,'chris','123456')) AS v("id","firstname","surname","yob","defensive_skill","offensive_skill","login","password")
从生成的SQL中可以看出,使用这种语法不可能跳过一列,这就是为什么多行更新会忽略skip
。但是,如果您一次只传入一个对象,您可以看到它正在工作,但这是一种与您正在寻找的不同的使用场景。您是插入到一个包含列的表中,还是只插入一列json/jsonb?假设这是一个表关系,它会告诉您,yob
列不存在,需要添加。@Lucas总共有八列,在更新时,我希望能够分别更新每一列。没有“json/jsonb列”。我认为我的问题与“pg promise”更相关。更正了类型的无效使用,来自c=>!c、 存在| | c==未定义代码>到c=>!c、 存在| | c.value==未定义代码>。感谢您提供的精确答案,我将一次更新一行,这似乎是最适合我的解决方案,因为我不想设置默认/init值。
UPDATE "players" AS t SET "firstname"=v."firstname","surname"=v."surname","yob"=v."yob","defensive_skill"=v."defensive_skill","offensive_skill"=v."offensive_skill","login"=v."login","password"=v."password" FROM (VALUES(25,'Stephen','Harrison',1991,5,3,'harry','123456'),(26,'Chr
is','Jackson',null,5,4,'chris','123456')) AS v("id","firstname","surname","yob","defensive_skill","offensive_skill","login","password")