您的查询中有 2 个问题。
第一个是您正在使用 ES6 模板字符串,同时还使用带有${propName}
语法的 sql 格式。
从图书馆的文档:
命名参数使用语法 $*propName* 定义,其中 * 是以下任一开闭对:{}、()、[]、<>、//,因此您可以根据自己的喜好使用其中一个,但请记住{} 也用于 ES6 模板字符串中的表达式。
因此,您要么从 ES6 模板字符串更改为标准字符串,要么简单地切换到不同的变量语法,例如$/propName/
or $[propName]
,这样您就可以避免冲突。
第二个问题是我前面在评论中指出的,在生成正确的 SQL 名称时,使用记录为SQL Names的内容。
下面是一种更简洁的查询格式化方法:
db.query('update ${schema~}.chats set messages = array_prepend(${message}, messages) where chat_id = ${chatId}', {
schema: 'your schema name',
chatId: 'your chat id',
message: {
sender: 'set the sender here',
tstamp: 'set the time you need',
body: 'set the body as needed'
}
}
);
如果对您尝试执行的查询类型有疑问,查看它的最快方法是 via pgp.as.format(query, values)
,它将为您提供确切的查询字符串。
如果您仍然想将 ES6 模板字符串用于其他用途,那么您可以将字符串更改为:
`update $/schema~/.chats set messages = array_prepend($/message/, messages) where chat_id = $/chatId/`
这只是一个例子,语法很灵活。请记住不要使用 ES6 模板字符串格式化将值注入查询,因为 ES6 模板不知道如何正确格式化 JavaScript 类型以符合 PostgreSQL,只有库知道。