Помощники ColumnSet — использование Raw только по умолчанию

Я пытаюсь использовать помощники ColumnSet для генерации запроса на вставку и обновление, но у меня есть столбец, который я хочу отформатировать с помощью pg-promise query-formatter, если он передан, или в противном случае по умолчанию используется :raw (^), что в данном случае это now().

Пример кода такой:

const cs = new helpers.ColumnSet([
    'lastname',
    {
        name: 'rental_date',
        mod: '^',
        def: 'now()'
    }
], { table: { table: 'book_rental', schema: 'public' } })


let rental1 =
    {
        lastname: 'Mueller', rental_date: '2020-05-01T12:15:063Z'
    };

let rental2 =
    {
        lastname: 'Smith'
    };


let insert = helpers.insert(rental1, cs)

db.result(insert)
    .then(data => res.json({ message: 'Ok!' }))
    .catch(err => res.json({ message: 'Not ok!' }))

Rental1 должен INSERT INTO (last_name, rental_date) VALUES ('Mueller', '2020-05-01T12:15:063Z' ), а Rental2 должен INSERT INTO (last_name, rental_date) VALUES ('Smith', now() ). Однако это вызывает ошибку, так как Rental1 также отформатирован как :raw.

Вероятно, это распространенный вариант использования, поэтому я, вероятно, что-то упускаю ... как мне добиться этого с помощью помощников, чтобы только при запуске по умолчанию использовался режим :raw?


person Andrew Ooi    schedule 06.07.2020    source источник


Ответы (1)


Из Raw Text документации:

Такие переменные не могут быть null или undefined из-за неоднозначного значения в этом случае, и эти значения вызовут ошибку Values null/undefined cannot be used as raw text.

Значения по умолчанию, предоставленные через свойство def, задокументированы для использования. только когда свойство отсутствует:

Значение по умолчанию для свойства, которое будет использоваться только в том случае, если исходный объект не имеет свойства.

Это означает, что вы создаете логическое противоречие, которое не может работать.


В вашем случае может быть любое количество допустимых решений, так как синтаксис библиотеки очень гибкий. Ниже приведены лишь некоторые примеры, из которых вы можете выбрать.

подход 1

{
    name: 'rental_date',
    init: c => c.exists ? c.value : {toPostgres: () => 'now()', rawText: true}
}

подход 2

{
    name: 'rental_date',
    mod: ':raw',
    init: c => c.exists ? pgp.as.text(c.value) : 'now()'
}

подход 3 — чистый и повторно используемый пример с использованием современного синтаксиса:

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

{
    name: 'rental_date',
    init: c => c.value ?? rawText('now()')
}

подход 4 — смешивание с использованием def:

{
    name: 'rental_date',
    def: 'now()',
    mod: ':raw',
    init: c => c.exists ? pgp.as.text(c.value) : c.value
}

подход 5:

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

{
    name: 'rental_date',
    def: rawText('now()')
}

...и так далее.

Возможно, решение 5 лучше всего подходит для того, что вам нужно, оно одновременно самое чистое и пригодное для повторного использования.

person vitaly-t    schedule 07.07.2020