我是nodejs的新手,并试图使用pg-promise来完成对我的PG数据库的所有请求。我希望能够动态更新列,这意味着有时我只会更新两个列,有时我会更新所有这些列,等等...我的输入将是JSON。
由于我希望端点能够更新多个行,因此我尝试使用columnset的助手名称空间。
这是我的JavaScript代码(灵感来自以前的stackoverflow答案(:
/* logic for skipping columns: */
const skip = c => !c.exists || c.value === undefined;
/* all the columns of the table */
const column_structure = new dbconfig.pgp.helpers.ColumnSet(
[ '?id',
{name: 'firstname', skip},
{name: 'surname', skip},
{name: 'yob', skip}, // year of birth
{name: 'defensive_skill', skip},
{name: 'offensive_skill', skip},
{name: 'login', skip},
{name: 'password', skip}
],
{table: 'players'});
这是我要喂入端点的JSON:
[{
"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"之外,所有列将被更新。我做错了吗?
其原因不起作用,是因为skip
逻辑仅用于单行更新,如API中所记录的:
方法
update
(对于一个对象(...
多行更新语法不允许任何跳过逻辑,因此当属性丢失时,您需要提供默认值,例如:
{name: 'yob', skip, def: defaultValue}
defaultValue
可以是上面的任何东西,包括 undefined
。
另外,您可以使用属性init
,然后动态返回值。
因此,在上面的代码中,如果将列声明更改为:
{name: 'yob', skip, def: null}
您的update
呼叫将生成:
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
在多行更新中被忽略。如果您一次传递一个对象,则可以看到它但是工作,但这与您要寻找的对象不同。