我使用ColumnSet和helper.insert函数进行多行插入。
我有一个表格列,我想使用Postgres Date/Time now()函数。
const cs = new helpers.ColumnSet([
'lastname',
{
name: 'rental_date',
def: 'now()'
}
], { table: { table: 'book_rental', schema: 'public' } })
let rentals = [
{
lastname: 'Mueller'
},
{
lastname: 'Johnson'
}
]
let insert = helpers.insert(rentals, cs)
db.result(insert)
.then(data => res.json({ message: 'Ok!' }))
.catch(err => res.json({ message: 'Not ok!' }))
似乎使用def: 'now()'
工作,但我想确保以正确的方式使用它。
修改:
关于评论中的答案。我尝试手动执行插入操作,看起来Postgres正在将'now()'
字符串转换为now()
函数。
INSERT INTO book_rental (lastname, rental_date) VALUES ('Mueller', 'now()');
要涉及你的答案,我是对的,那么这应该是正确的代码吗?
const cs = new helpers.ColumnSet([
'lastname',
{
name: 'rental_date',
mod: ':raw',
def: 'now()'
}
], { table: { table: 'book_rental', schema: 'public' } })
答案 0 :(得分:2)
由于以下原因,您的代码看起来不正确:
now()
,但def
值仅在源对象中不存在属性时使用(请参阅Column)。应该使用init
回调来保证正确的值覆盖。now()
作为转义字符串返回,而查询则需要将其作为原始文本字符串。首先,让我们根据Raw Text声明一个可重复使用的Custom Type Formatting字符串:
const rawText = text => ({toPostgres: () => text, rawType: true});
然后你可以像这样定义列:
{
name: 'rental_date',
init: () => rawText('now()')
}
并确保您使用的是最新版本的pg-promise(截至撰写本文时为v7.2.1)。
或者,您可以这样声明:
{
name: 'rental_date',
mod: ':raw', // same as mode: '^'
init: () => 'now()'
}
然而,这种语法适用于所有版本的库,甚至可能更易于使用;)