Skip to content

Prisma migrate diff flaky Error in Schema engine #29062

@antonio-ivanovski

Description

@antonio-ivanovski

Bug description

I have a monorepo with Nx managing it. There are few packages with different databases. With the latest version upgrade 7.2 when i run prisma migrate diff sometimes i get failure of Error in Schema engine.

Severity

⚠️ Major: Breaks core functionality (e.g., migrations fail)

Reproduction

Usually doesn't fail on the first time, usually it takes about 15-20 times, but this coupled with me having 10 packages having separate schema, it is 50% chance that it will fail for one.

I have created this loop to reproduce it. In shell script it fails after 10 tries. In node execSync it fails more often.

#!/usr/bin/env bash
set -euo pipefail

counter=0

while true; do
    counter=$((counter + 1))
    echo "Attempt #${counter}"

    pnpm exec prisma migrate diff \
        --from-schema=existing.prisma \
        --to-schema=schema.prisma \
        --script

    echo "Success count: ${counter}"
done

schema.prisma

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider      = "prisma-client"
  output        = "../src/generated/prisma"
  moduleFormat = "esm"
  engineType = "client"
}

datasource db {
  provider = "postgresql"
}

model configurations {
  accountId  String @map("account_id")
  resourceId String @map("configuration_id")

  name   String @map("configuration_name")
  values Json   @map("configuration_json")

  createdAt DateTime @default(now()) @map("created_at")
  updatedAt DateTime @updatedAt @map("updated_at")

  instances instances[]

  @@id([accountId, resourceId])
  @@map("verifier_configurations")
}

model instances {
  resourceId String @map("instance_id")

  accountId                String   @map("account_id")
  name                     String   @map("instance_name")
  configurationResourceId          String?  @map("configuration_resource_id")
  inlineConfiguration      Json     @default("{}") @map("inline_configuration")

  createdAt DateTime @default(now()) @map("created_at")
  updatedAt DateTime @updatedAt @map("updated_at")

  status VerifierStatus @default(RUNNING) @map("status")

  configuration configurations? @relation(fields: [accountId, configurationResourceId], references: [accountId, resourceId], onDelete: Restrict)

  @@id([accountId, resourceId])
  @@unique([resourceId])
  @@map("verifier_instances")
}

// must match the enum in packages/types/src/verifier/status.ts
enum VerifierStatus {
  UNKNOWN
  STOPPED
  RUNNING
}

existing.schema

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider      = "prisma-client"
  output        = "../src/generated/prisma"
  moduleFormat = "esm"
  engineType = "client"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model configurations {
  accountId  String @map("account_id")
  resourceId String @map("configuration_id")

  name   String @map("configuration_name")
  values Json   @map("configuration_json")

  createdAt DateTime @default(now()) @map("created_at")
  updatedAt DateTime @updatedAt @map("updated_at")

  instances instances[]

  @@id([accountId, resourceId])
  @@map("verifier_configurations")
}

model instances {
  resourceId String @map("instance_id")

  accountId                String   @map("account_id")
  name                     String   @map("instance_name")
  configurationResourceId          String?  @map("configuration_resource_id")
  inlineConfiguration      Json     @default("{}") @map("inline_configuration")

  createdAt DateTime @default(now()) @map("created_at")
  updatedAt DateTime @updatedAt @map("updated_at")

  status VerifierStatus @default(RUNNING) @map("status")

  configuration configurations? @relation(fields: [accountId, configurationResourceId], references: [accountId, resourceId], onDelete: Restrict)

  @@id([accountId, resourceId])
  @@unique([resourceId])
  @@map("verifier_instances")
}

// must match the enum in packages/types/src/verifier/status.ts
enum VerifierStatus {
  UNKNOWN
  STOPPED
  RUNNING
}

Expected vs. Actual Behavior

Expected: success

Frequency

Intermittent / Random

Does this occur in development or production?

Only in development (e.g., CLI tools, migrations, Prisma Studio)

Is this a regression?

Previosluy on 6.19.0, never failed

Workaround

Retry loop with 5 attempt.

Prisma Schema & Queries

In the reproduction steps

Prisma Config

None

Logs & Debug Info

                                                                                                                                              
prisma:getSchema Reading schema from single file /Users/antonio/dev/vidos/schema.prisma +0ms                                                  
prisma:engines binaries to download schema-engine +1468ms                                                                                     
prisma:getSchema Checking existence of /Users/antonio/dev/vidos/prisma/schema.prisma +10ms                                                    
prisma:getSchema Reading schema from single file /Users/antonio/dev/vidos/prisma/schema.prisma +0ms                                           
prisma:getSchema Checking existence of /Users/antonio/dev/vidos/prisma/schema.prisma +0ms                                                     
prisma:getSchema Reading schema from single file /Users/antonio/dev/vidos/prisma/schema.prisma +0ms                                           
prisma:cli:checkpoint Error from runCheckpointClientCheck() +1ms                                                                              
prisma:cli:checkpoint {} +0ms                                                                                                                 
prisma:cli:checkpoint Error from tryToReadDataFromSchema() while processing the schema. This is not a fatal error. It will continue without th
e processed data. +1ms                                                                                                                        
prisma:cli:checkpoint {} +0ms                                                                                                                 
prisma:getSchema Reading schema from single file /Users/antonio/dev/vidos/.output/prisma-migrate/spec/databases/gateway/existing.prisma +212ms
prisma:getSchema Reading schema from single file /Users/antonio/dev/vidos/spec/databases/gateway/prisma/schema.prisma +2ms                    
prisma:schemaEngine:rpc starting Schema engine with binary: /Users/antonio/dev/vidos/node_modules/.pnpm/@prisma+engines@7.2.0/node_modules/@pr
isma/engines/schema-engine-darwin-arm64 +2ms                                                                                                  
prisma:schemaEngine:rpc SENDING RPC CALL {"id":1,"jsonrpc":"2.0","method":"diff","params":{"from":{"tag":"schemaDatamodel","files":[{"path":"/
Users/antonio/dev/vidos/.output/prisma-migrate/spec/databases/gateway/existing.prisma","content":"// This is your Prisma schema file,\n// lear
n more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n  provider      = \"prisma-client\"\n  output        = \".
./src/generated/prisma\"\n  moduleFormat = \"esm\"\n  engineType = \"client\"\n}\n\ndatasource db {\n  provider = \"postgresql\"\n  url      =
 env(\"DATABASE_URL\")\n}\n\nmodel configurations {\n  accountId  String @map(\"account_id\")\n  resourceId String @map(\"configuration_id\")\
n\n  name   String @map(\"configuration_name\")\n  values Json   @map(\"configuration_json\")\n\n  createdAt DateTime @default(now()) @map(\"c
reated_at\")\n  updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n  instances instances[]\n\n  @@id([accountId, resourceId])\n  @@map(\"ga
teway_configurations\")\n}\n\nmodel instances {\n  resourceId String @map(\"instance_id\")\n\n  accountId                String   @map(\"accou
nt_id\")\n  name                     String   @map(\"instance_name\")\n  configurationResourceId          String?  @map(\"configuration_resour
ce_id\")\n  inlineConfiguration      Json     @default(\"{}\") @map(\"inline_configuration\")\n\n  createdAt DateTime @default(now()) @map(\"c
reated_at\")\n  updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n  status GatewayStatus @default(RUNNING) @map(\"status\")\n\n  configura
tion configurations? @relation(fields: [accountId, configurationResourceId], references: [accountId, resourceId], onDelete: Restrict)\n\n  @@i
d([accountId, resourceId])\n  @@unique([resourceId])\n  @@map(\"gateway_instances\")\n}\n\n// must match the enum in packages/types/src/gatewa
y/status.ts\nenum GatewayStatus {\n  UNKNOWN\n  STOPPED\n  RUNNING\n}\n"}]},"to":{"tag":"schemaDatamodel","files":[{"path":"/Users/antonio/dev
/vidos/spec/databases/gateway/prisma/schema.prisma","content":"// This is your Prisma schema file,\n// learn more about it in the docs: https:
//pris.ly/d/prisma-schema\n\ngenerator client {\n  provider      = \"prisma-client\"\n  output        = \"../src/generated/prisma\"\n  moduleF
ormat = \"esm\"\n  engineType = \"client\"\n}\n\ndatasource db {\n  provider = \"postgresql\"\n}\n\nmodel configurations {\n  accountId  Strin
g @map(\"account_id\")\n  resourceId String @map(\"configuration_id\")\n\n  name   String @map(\"configuration_name\")\n  values Json   @map(\
"configuration_json\")\n\n  createdAt DateTime @default(now()) @map(\"created_at\")\n  updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n 
 instances instances[]\n\n  @@id([accountId, resourceId])\n  @@map(\"gateway_configurations\")\n}\n\nmodel instances {\n  resourceId String @m
ap(\"instance_id\")\n\n  accountId                String   @map(\"account_id\")\n  name                     String   @map(\"instance_name\")\n
  configurationResourceId          String?  @map(\"configuration_resource_id\")\n  inlineConfiguration      Json     @default(\"{}\") @map(\"i
nline_configuration\")\n\n  createdAt DateTime @default(now()) @map(\"created_at\")\n  updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n 
 status GatewayStatus @default(RUNNING) @map(\"status\")\n\n  configuration configurations? @relation(fields: [accountId, configurationResourc
eId], references: [accountId, resourceId], onDelete: Restrict)\n\n  @@id([accountId, resourceId])\n  @@unique([resourceId])\n  @@map(\"gateway
_instances\")\n}\n\n// must match the enum in packages/types/src/gateway/status.ts\nenum GatewayStatus {\n  UNKNOWN\n  STOPPED\n  RUNNING\n}\n
"}]},"script":true,"shadowDatabaseUrl":null,"exitCode":null,"filters":{"externalTables":[],"externalEnums":[]}}} +3ms                         
prisma:schemaEngine:stderr error: The following required arguments were not provided: +13ms                                                   
prisma:schemaEngine:stderr     --datasource <JSON> +1ms                                                                                       
prisma:schemaEngine:stderr  +0ms                                                                                                              
prisma:schemaEngine:stderr USAGE: +0ms                                                                                                        
prisma:schemaEngine:stderr     schema-engine-darwin-arm64 [OPTIONS] --datasource <JSON> [SUBCOMMAND] +0ms                                     
prisma:schemaEngine:stderr  +0ms                                                                                                              
prisma:schemaEngine:stderr For more information try --help +0ms                                                                               
Error: Error: Error in Schema engine:                                                                                                         
    at ChildProcess.<anonymous> (/Users/antonio/dev/vidos/node_modules/.pnpm/prisma@7.2.0_@types+react@19.2.2_magicast@0.3.5_react-dom@19.2.0_
react@19.2.0__react@19.2.0_typescript@5.9.3/node_modules/prisma/build/index.js:400:116)                                                       
    at ChildProcess.emit (node:events:508:28)                                                                                                 
    at ChildProcess._handle.onexit (node:internal/child_process:294:12)                                                                       

Environment & Setup

  • OS: macos but also on ubuntu ci
  • Database: PostgreSQL
  • Node.js version: v24.12.0

Prisma Version

pnpm prisma -v                                                            
prisma               : 7.2.0
@prisma/client       : 7.2.0
Operating System     : darwin
Architecture         : arm64
Node.js              : v24.12.0
TypeScript           : 5.9.3
Query Compiler       : enabled
PSL                  : @prisma/prisma-schema-wasm 7.2.0-4.0c8ef2ce45c83248ab3df073180d5eda9e8be7a3
Schema Engine        : schema-engine-cli 0c8ef2ce45c83248ab3df073180d5eda9e8be7a3 (at node_modules/.pnpm/@prisma+engines@7.2.0/node_modules/@prisma/engines/schema-engine-darwin-arm64)
Default Engines Hash : 0c8ef2ce45c83248ab3df073180d5eda9e8be7a3
Studio               : 0.9.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    bug/2-confirmedBug has been reproduced and confirmed.kind/bugA reported bug.

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions