pg-promise通过以下方式插入格式:name和:csv

时间:2018-03-12 21:11:51

标签: javascript node.js pg-promise

我在pg-promise documentation

中观察到了这个代码示例
   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来查看传递给postgres的SQL。上面的输出是:

{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函数交换?

1 个答案:

答案 0 :(得分:1)

看起来问题与库版本有关。

当前版本为8.2.2。版本7.5.0中添加了自动属性枚举。

我确定您使用的是旧版本的版本,因此也存在问题。

通常,假设当前文档始终涵盖最新版本的库;)

如果怀疑正在加载哪个版本,您可以执行以下操作:

console.log(db.$config.version);