pg-promise ColumnSet使用带有def属性

时间:2017-11-03 11:27:45

标签: javascript pg-promise

我使用ColumnSethelper.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' } })

1 个答案:

答案 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()'
}

然而,这种语法适用于所有版本的库,甚至可能更易于使用;)