将集合映射到 upsert 到数据库中。如何批量更新插入?

Posted

技术标签:

【中文标题】将集合映射到 upsert 到数据库中。如何批量更新插入?【英文标题】:Map over collection to upsert into the database. How to batch upsert? 【发布时间】:2021-02-02 05:36:24 【问题描述】:

说,我有一个从前端进来的数据结构如下:

const userData = [
  
    id: 11223,
    bb: [
      
        id: 12,
      ,
      
        id: 34,
        bbb: "bbb",
      ,
    ],
  ,
  
    id:4234,
    ...
  ,
];

因为,没有/部分/所有数据可能已经在数据库中,这是我想出的:

const collection = [];
for (let i = 0; i < userData.length; i++) 
  const cur = userData[i];
  const subCur = cur.bb;
  const updatedCur = await db.cur.upsert(
      where: 
        id : cur.id
      ,
      update: 
        ...
      ,
      create: 
        ...
      ,
    )
  );
  collection.push(updatedCur);
  for (let j = 0; j < subCur.length; j++) 
    const latest = subCur[j];
    await db.subcur.upsert(
      where: 
        id : latest.id
      ,
      update: 
        ...
      ,
      create: 
        ...
      ,
    );
  

总而言之,我正在逐个映射 userData 和 upsert 每个对象。在循环中,我将子集合和upsert 映射到数据库中。

我担心我会以这种方式在 Db 中输入很多条目。这是最好的方法吗?

另外: 我之前尝试在upsert 中执行多个inserts,但是,据我所知,我被update 部分卡住了,我们无法在update 中插入多个记录,嵌套在upsert 中。这是正确的吗?

更新:

按照 Ryan 的要求,Schema 如下所示:

model Cur 
  id      Int,
  subCur  SubCur[]
  ...


model SubCur 
  id      Int,
  cur     Cur  @relation(fields: [curId], references : [id])
  curId   Int
  ...

总而言之,有许多模型,例如“SubCur”,与“Cur”模型具有 1-n 关系。作为“用户数据”有效负载,可能有一些新数据,一些是数据库中已有数据的更新,我很好奇,将upsert 数据放入数据库的最佳方法是什么。具体来说,我是否必须一次插入一个?

【问题讨论】:

【参考方案1】:

我假设您的架构是这样的:

model Cur 
  id Int @id


model Subcur 
  id  Int     @id
  bbb String?


还有一个更好的版本:

const collection = await prisma.$transaction(
    userData.map(cur =>
      prisma.cur.upsert(
        where:  id: cur.id ,
        update: ,
        create:  id: cur.id ,
      )
    )
  )

  await prisma.$transaction(
    userData
      .flatMap(cur => cur.bb)
      .map(latest =>
        prisma.subcur.upsert(
          where: 
            id: latest.id,
          ,
          update: 
            bbb: latest.bbb,
          ,
          create: 
            id: latest.id,
            bbb: latest.bbb,
          ,
        )
      )
  )

【讨论】:

以上是关于将集合映射到 upsert 到数据库中。如何批量更新插入?的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy Upsert无法找到表“已排除”

谈反应式编程在服务端中的应用,数据库操作优化,提速 Upsert

如何将数据类型映射到该数据类型的集合

使用 pyspark 流式传输到 HBase

如何将多个值类型集合映射到 Hibernate 中的一个表?

如何使用Automapper将更改映射到现有集合?