当我导入带有ColumnSet中Column的initCB属性的数据时,我尝试在记录集中拆分一个子对象。
但是当我对两个不同的目的地名称使用两个不同的init函数但一个源时,我得到的结果相同。
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')
似乎是对SAME源字段的回调函数的第二次调用,覆盖了先前在THIS源字段上调用ANOTHER回调函数的结果。
如何避免这种情况? 还是有另一种在导入过程中拆分子对象的方法?
答案 0 :(得分:1)
选项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'});
第一个source
是pg-promise
API所支持的,第二个是您的数据列名称:)
此外,根据documentation,API会将source
和this
设置为相同,因此,如果您更喜欢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
指向源数据对象。