실수로 Prisma로 모든 테이블 데이터를 삭제한 적이 있습니까?

이것은 버그가 아니라 기능에 대한 이야기입니다!

코드에서 table.updateMany 또는 table.deleteMany를 사용한 적이 있습니까? 우리는 다음과 같았습니다.

const deleteChildrenOfThatParent = await prisma.children.deleteMany({
  where: {
    parentEmail: {
      equal: parent.email,
    },
  },
})


그것은 오랫동안 훌륭하게 작동했고 TS도 유형을 확인했지만 언젠가는 테이블에서 모든 어린이 데이터를 잃어 버렸습니다.
우리는 데이터베이스(Postgres)를 확인했고 특정 시간에 모든 데이터가 삭제되었음을 발견했습니다! 우리는 DevOps, 해커, AWS를 비난했지만 다른 누구도 아닌 우리였습니다.

마지막으로 parent.emailundefined인 상황이 있을 수 있음을 알아냈습니다. 그러나 여전히 우리는 그것을 실행할 조건이 있는 deleteMany을 믿을 수 없었습니다. 약간의 테스트 후 우리는 충격을 받았지만 그것은 사실이었고 실제로 그것은 의미가 있었습니다... 우리의 "where"절은 단지 그것 때문에 모든 자식을 삭제하는 방식으로 코드를 만들었습니다undefined . 우리는 기본적으로 다음을 실행했습니다.

const deleteChildrenOfThatParent = await prisma.children.deleteMany({
  where: {},
  },
})


그래도 무엇이 우리를 구할 수 있었습니까?

레트로



그래서 우리는 그 주위에 복고풍이 있었고 거기에는 화난 이해 관계자들이 있었습니다! 우리는 다시는 이런 일이 일어나지 않을 것이라고 그들에게 약속했습니다! 먼저 모든 updateManydeleteMany 기능을 찾아 북마크했습니다. 우리는 undefined를 확인하기 위해 각각 앞에 조건을 둘 수 있었지만 이것은 영구적인 해결책이 아니었고 확장 가능한 해결책도 아니었습니다.
약간의 조사 끝에 우리는 훌륭한 해결책을 찾았습니다. 예, Prisma 자체가 도움을 주었습니다 :p

Prisma 미들웨어



그래서 우리가 구현해야 했던 것은 우리가 삭제하고 싶지 않은 데이터를 제거하지 않도록 하기 위해 모든 변이를 ​​확인할 수 있는 프리즈마의 하위 계층에 있는 무언가였습니다. Prisma Middleware 그게 YES!

우리는 모든 쿼리(변형)를 확인하고 updateManydeleteMany 쿼리를 필터링하고 조건이 있는지 확인하는 방식으로 미들웨어를 구현했습니다!

async function main() {
  prisma.$use(async (params, next) => {
    // Check incoming query type
    if (params.model === 'Post') {
      if (params.action === 'deleteMany' || params.action === 'updateMany') {
        //Check the Where clause in params.arg.where, if it's empty just return
      }
    }
    return next(params)
  })

좋은 웹페이지 즐겨찾기