TypeORM插入操作中数据结构意外变更是否为预期行为?
TypeORM插入分片数据后原数组自动添加实体字段是否属于预期行为
结论
这是TypeORM insert 方法的预期行为,根源在于JavaScript的对象引用机制和TypeORM的内部处理逻辑。
原因拆解
- JavaScript里对象是引用类型,你用
chunkArray拆分出来的productChunk,里面的元素和原filteredProducts里的元素是同一个对象——只是换了个数组装它们而已,指向的内存地址完全一样。 - TypeORM的
insert方法执行完成后,会自动把数据库生成的id、createdAt、updatedAt这些字段直接赋值到传入的对象上,目的是让内存里的对象和数据库状态保持同步。 - 所以哪怕你操作的是分片后的数组,本质上还是在修改原
filteredProducts里的对象,原数组自然会出现这些新增字段。
解决办法
如果不想让原数组被修改,只需要在分片前对原数据做深拷贝,切断引用关系就行:
// 用JSON序列化/反序列化做深拷贝(适合结构简单的数据) const filteredProducts = JSON.parse(JSON.stringify(yourBulkyData)); // 如果数据里有函数、特殊类型,建议用lodash的cloneDeep // import cloneDeep from 'lodash/cloneDeep'; // const filteredProducts = cloneDeep(yourBulkyData); const productChunks = chunkArray(filteredProducts, 100); for (const productChunk of productChunks) { await this.productPriceRepo.insert(productChunk); console.log('Dumped in Database ', productChunk.length); } products.push(filteredProducts);
这样插入操作只会修改拷贝后的对象,原数据就不会被影响了。
内容的提问来源于stack exchange,提问作者CFCIFE
相关产品推荐
相关产品推荐

