pg-prom ColumnSet использует функции Postgres с def def

Вопрос:

Я использую 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' } })

Лучший ответ:

Ваш код выглядит неправильно, по следующим причинам:

  • Вы хотите использовать now() без каких-либо условий, но значение def используется только тогда, когда свойство не существует в исходном объекте (см. Колонка). Обратный вызов init — это то, что следует использовать вместо этого, чтобы гарантировать правильное переопределение значения.
  • Вы возвращаетесь now() как экранированная строка, в то время как запрос нуждается в ней как строка с исходным текстом.

Во-первых, пусть объявляет повторно используемую строку Raw Text в соответствии с форматированием пользовательского типа:

const rawText = text => ({toPostgres: () => text, rawType: true});

Затем вы можете определить столбец следующим образом:

{
    name: 'rental_date',
    init: () => rawText('now()')
}

И убедитесь, что вы используете последнюю версию pg- prom (v7.2.1 на момент написания этой статьи).

Или, альтернативно, вы можете объявить это следующим образом:

{
    name: 'rental_date',
    mod: ':raw', // same as mode: '^'
    init: () => 'now()'
}

Однако этот синтаксис будет работать во всех версиях библиотеки и, возможно, еще проще использовать;)

Оцените статью
TechArks.Ru
Добавить комментарий