pg-обещание вставить форматирование через: name и: csv

Я видел этот пример кода из pg-promise документации:

   const obj = {
        one: 1,
        two: 2
    };
    db.query('INSERT INTO table(${this:name}) VALUES(${this:csv})', obj);
    //=> INSERT INTO table("one","two") VALUES(1, 2)

Я пытаюсь сделать что-то подобное, вот MWE:

var insertObj = {rating_text: 'Example goes here!',
                 pros: 'Example pro',
                 cons: 'Example con',
                 stars: '5',
                 product_id: '20',
                 account_id: '1'}
var insertObj['rating_date'] = Date.now()
console.log(insertObj)
console.log(pgp.as.format('INSERT INTO product_rating(${this:name}) VALUES(${this:csv})', insertObj))
db.none('INSERT INTO product_rating(${this:name}) VALUES(${this:csv})', insertObj)

Я использую pgp.as.format для просмотра SQL, передаваемого в postgres. Результат вышеизложенного:

{rating_text: 'Example goes here!',
 pros: 'Example pro',
 cons: 'Example con',
 stars: '5',
 product_id: '20',
 account_id: '1',
 rating_date: 1520886741488}

INSERT INTO product_rating("rating_text",
                           "pros",
                           "cons",
                           "stars",
                           "product_id",
                           "account_id",
                           "rating_date") VALUES('{"rating_text":"Example goes here!",
                                                   "pros"       :"Example pro",
                                                   "cons"       :"Example con",
                                                   "stars"      :"5",
                                                   "product_id" :"20",
                                                   "account_id" :"1",
                                                   "rating_date":1520886741488}')

Я отформатировал SQL для удобства чтения.

Очевидно, что этот SQL-код не работает, поскольку весь объект представлен как одна строка и возвращает ошибку:

UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): error: INSERT has more target columns than expressions

Я ожидал, что VALUES() будет отформатирован как в документации.

Почему пример документации не работает в моем MWE? Это из-за замены функций db.query -> db.none?


person BML91    schedule 12.03.2018    source источник


Ответы (1)


Похоже, проблема в версии библиотеки.

Текущая версия - 8.2.2. А автоматическое перечисление свойств было добавлено в версии 7.5.0 < / а>.

Я уверен, что вы используете более старую версию, и отсюда проблема.


В общем, предположим, что текущая документация всегда охватывает самую последнюю версию библиотеки;)

Если вы сомневаетесь, какая версия загружается, вы можете сделать следующее:

console.log(db.$config.version);
person vitaly-t    schedule 12.03.2018
comment
Кажется, вы были правы, я был на 7.3.3! Спасибо. С другой стороны, как вы сами задаете вопрос, как правильно вставить javascript Date() в столбец postgres timestamp по умолчанию? - person BML91; 13.03.2018
comment
@ BML91 Никогда не используйте тип timestamp, используйте вместо него timestamptz. И тогда достаточно форматирования по умолчанию для Date;) - person vitaly-t; 13.03.2018
comment
странно, я изменил с timestamp на timestamptz, однако при попытке вставить Date() я все равно получаю сообщение об ошибке invalid input syntax for type timestamp with time zone: "Mon Mar 12 2018 22:47:16 GMT+0000 (GMT)". - РЕДАКТИРОВАТЬ: моя ошибка - мне просто нужно new Date(), а не Date() :) - person BML91; 13.03.2018