Skip to content

[BUG] - having delete and create in the same query starts first with create and only then with delete - ignoring the order if the object #2104

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
Tsimopak opened this issue May 1, 2025 · 0 comments

Comments

@Tsimopak
Copy link

Tsimopak commented May 1, 2025

Prisma had a feature some time ago that the order of Delete and Create in the same query should preserve - the same way the developer actually wrote it in code
But it seems not to be the case when using enhanced db.

An example:

DB:

model Post {
    id Int @id @default(autoincrement())
    tickets TicketInPost[]
    @@allow('all', true)
}

model View {
  id Int @id @default(autoincrement())
  ability String
  tickets TicketInPost[]
  @@allow('all', true)
}

model TicketInPost {
  id Int @id @default(autoincrement())
  postId Int
  post Post @relation(fields: [postId], references: [id])
  viewId Int
  view View @relation(fields: [viewId], references: [id])
  @@allow('all', true)
}

QUERY:

import { PrismaClient } from '@prisma/client';
import { enhance } from '@zenstackhq/runtime';

const prisma = new PrismaClient();
const db = enhance(
  prisma,
  {},
  {
    kinds: ['delegate', 'policy'],
    logPrismaQuery: true,
  }
);

async function main() {
  const view = await db.view.create({ data: { ability: 'bla' }})
  const post = await db.post.create({ data: {} })
  const updatedPost = await db.post.update({
    where: {
      id: post.id
    },
    data: {
      tickets: {
        deleteMany: {},
        create: {
          viewId: view.id
        }
      }
    },
    include: {
      tickets: true
    }
  })
  console.log('created!', updatedPost)
}

main()

If I use db variable to create the models, I get in return:

created! { id: 4, tickets: [] }

if I use prisma variable to create the models, I get in return:

created! { id: 5, tickets: [ { id: 3, postId: 5, viewId: 3 } ] }

Because the order I chose was first delete and only then create.
BTW If I would have chosen to do it in reverse, even when using prisma, I wouldn't see anything, so for example:

  const updatedPost = await prisma.post.update({
    where: {
      id: post.id
    },
    data: {
      tickets: {
        create: {
          viewId: view.id
        },
        deleteMany: {},
      }
    },
    include: {
      tickets: true
    }
  })

would lead to:

created! { id: 6, tickets: [] }

even when using prisma

INFO:
"devDependencies": {
"prisma": "6.6.x",
"typescript": "^5.8.3",
"zenstack": "2.14.0"
},
"dependencies": {
"@prisma/client": "6.6.x",
"@zenstackhq/runtime": "2.14.0"
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant