从 ColumnSet 访问源对象

Source object access from ColumnSet

在使用 ColumnSet 中 Column 的 initCB 属性导入数据时,我尝试在我的记录集中拆分一个子对象。

但是当我对两个不同的目标名称使用两个不同的初始化函数时,我得到了相同的结果。

const cs = new pgp.helpers.ColumnSet([
  'id',
  { name: 'source_id', prop: 'source', init: function(obj) { return obj.value.id; } },
  { name: 'source_name', prop: 'source', init: function(obj) { return obj.value.name; } },
], { table: 'test_table' });

const data = [
  { id: 1, source: { id: 1, name: 'source1' } },
  { id: 2, source: { id: 1, name: 'source1' } },
  { id: 3, source: { id: 2, name: 'source2' } },
];

const insert = pgp.helpers.insert(data, cs);

结果是:

INSERT INTO "test_table"("id","source_id","source_name") VALUES
  (1,'source1','source1'),
  (2,'source1','source1'),
  (3,'source2','source2')

而不是预期的:

INSERT INTO "test_table"("id","source_id","source_name") VALUES
  (1,1,'source1'),
  (2,1,'source1'),
  (3,2,'source2')

似乎是对同一个源字段的回调函数的第二次调用覆盖了之前对该源字段调用另一个回调函数的结果。

如何避免这种情况? 或者还有其他方法可以在导入时拆分子对象?

选项 prop 不太适用。它用于将 value 重新映射到不同的 属性 名称,但它不提供直接对象引用。

而是使用 column descriptor 的 属性 source 来引用源对象。具有讽刺意味的是,您在数据 source 中也调用了 属性,这意味着您将不得不在引用中使用两次 source

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

第一个 sourcepg-promise API 支持的,而第二个是您的数据列名称:)

此外,根据 documentation,API 将 sourcethis 设置为相同,因此如果您更喜欢 ES5 函数语法(看起来更简洁例如),那么你可以这样做:

const cs = new pgp.helpers.ColumnSet([
    'id',
    { name: 'source_id', init: function() {return this.source.id;}},
    { name: 'source_name', init: function() {return this.source.name;}},
], { table: 'test_table' });

上面我们 this 指向源数据对象。