插入对象而不匹配列名

时间:2017-12-09 02:08:54

标签: javascript pg-promise

这可能是一个愚蠢的问题,但我是node和postgresql的新手,所以我很挣扎。

我正在尝试使用pgp.helpers.insert将多个对象插入到数据库中,如下例所示:

users = [{mycolumn:{name: 'John', age:23}}, {mycolumn:{name: 'Mike', age: 30}}];
query = pgp.helpers.insert(users, ['mycolumn:json'], 'mytable');
// insert into "mytable"("mycolumn") values('{"name":"John","age":23}'),('{"name":"Mike","age":30}')

上面的代码插入mytable 2行,mycolumn为jsonb。

但是我试图直接插入mycolumn对象数组中的值,而不包装我的原始对象,例如:

users = [{name: 'John', age:23}, {name: 'Mike', age: 30}];
query = pgp.helpers.insert(users, ['mycolumn:json'], 'mytable');
// Error: Property 'mycolumn' doesn't exist.

当然它不起作用,因为该对象不包含mycolumn属性。但是我认为在我的数组中迭代包含原始对象的列名称并不优雅,特别是因为我正在处理数百万行(当然是批量工作)。

提前致谢。

1 个答案:

答案 0 :(得分:1)

根据Column语法:

,您可以对列使用以下定义
{
  name: 'mycolumn',
  init: c => c.source // use the source object itself
}

const cs = new pgp.helpers.ColumnSet([
    {
      name: 'mycolumn',
      init: c => c.source
    }
], {table: 'mytable'});

然后使用它:

const query = pgp.helpers.insert(users, cs);

请注意,我们没有指定修饰符 - mod: ':json',因为我们从init返回一个对象,默认情况下对象的格式为JSON。