Prisma Release Notes

Follow

405 release notes curated from 59 sources by the Releasebot Team. Last updated: Nov 7, 2026

Get this feed:
  • Nov 6, 2026
    • Date parsed from source:
      Nov 6, 2026
    • First seen by Releasebot:
      Nov 7, 2026
    Prisma logo

    Prisma

    v8.0.0-rc.23

    Prisma releases v8.0.0-rc.23 with broader database type support, MySQL ORM writes, richer migration operations, and improved MongoDB index handling. It also strengthens Supabase and PostgreSQL configuration, fixes runtime and streaming issues, and adds upgrade guidance for breaking changes.

    v8.0.0-rc.23

    MongoDB indexes carry their names, and migrations create and drop each index by its name. On PostgreSQL, Int, BigInt, Float, Decimal, String, Boolean and Bytes become convenience types, and SQLite and MySQL get the convenience date and time types. The pgvector, PostGIS, ParadeDB and citext packs find their extension through the search path, so db sign adopts a Supabase database. MySQL gets ORM writes. mongo() takes extension packs, and supabase() takes the options postgres() takes. Prisma ORM no longer refuses to start when it is loaded from more than one copy.

    The upgrade recipes for this hop: the app recipe and the extension recipe. Each breaking change below names the change ids to look for in them. The app recipe opens with the order to do the steps in. After upgrading, run prisma contract emit once, so a contract that an extension such as Supabase stamps with its version matches the installed package (contract-artifacts-restamp in the app recipe).

    Breaking changes

    MongoDB indexes carry their names. Every index of a MongoDB contract records the name MongoDB stores it under, so every MongoDB contract with an index gets a new storage hash. An index written without a name is named after its keys, such as email_1, the name earlier releases already gave it in the database, so no database changes. Migrations create and drop each index by that name, and an operation id names the index, as in index.users.create(email_1). Two indexes of one collection that would get one name, such as a unique and a sparse index on email, are refused; name one of them. A contract read with prisma6Schema() names each index as Prisma 6 did, such as User_email_key. Run prisma contract emit, run the script the app recipe ships to name the indexes of your migration snapshots, then run prisma db sign or plan a migration, which has no operations. Extension authors: MongoIndex, MongoSchemaIndex and their input types take a required name, CreateIndexCall and DropIndexCall take the index's name and options, and code that calls buildMongoContractFromDefinition calls nameIndexes first. See mongo-contracts-record-index-names, mongo-unnamed-indexes-with-one-name-refused, mongo-prisma6-index-names and mongo-index-operations-by-name in the app recipe, and mongo-index-name-required, mongo-index-calls-take-name and mongo-build-refusal-index-name-duplicate in the extension recipe. (#30952)

    Before:

    createIndex('users', [{ field: 'email', direction: 1 }], { unique: true }),
    

    After:

    createIndex('users', [{ field: 'email', direction: 1 }], { name: 'email_1', unique: true }),
    

    The Prisma 6 MongoDB reader keeps indexes as Prisma 6 wrote them. prisma6Schema() no longer merges indexes. Two indexes of one model with the same fields and the same written sort are refused with PSL.PRISMA6_MONGO_INDEX_ALREADY_EXISTS, as Prisma 6 refuses them. A unique and a plain index on the same keys that Prisma 6 accepts are both kept, so the contract gets a new storage hash; run prisma db sign again. Prisma 8 PSL and TypeScript still merge identical and redundant indexes. Extension authors: the MongoDB contract builder no longer merges indexes, BuildRefusal has the kind indexDuplicate again, and mergeRedundantIndexes merges before building. See mongo-prisma6-indexes-as-prisma6-reads-them in the app recipe, and mongo-build-refusal-index-duplicate-restored in the extension recipe. (#30921)

    The pgvector, PostGIS, ParadeDB and citext packs find their extension through the search path. Each pack declares its extension in the unbound namespace, so db sign and db verify accept the extension in any schema on the connection's search path, such as Supabase's extensions. A project that composes one of these packs runs prisma contract emit, which writes the pack's new migration, and then prisma db migrate, which applies it without changing the database. An application may no longer declare an extension that a composed pack declares; remove its own extension vector {} block or extension('vector') handle. Extension authors: a pack declares its Postgres extension in the unbound namespace, or the configuration is refused with CONTRACT.PACK_CONTRIBUTION_INVALID. See pack-extension-found-on-search-path and remove-pack-extension-declaration in the app recipe, and pack-declares-extension-unbound in the extension recipe. (#30956)

    mongo() and mongoStatic() refuse a contract whose extension packs they are not given. They take an extensions option, as postgres() does. A MongoDB project whose prisma.config.ts composes extension packs passes each pack's runtime descriptor to mongo({ extensions }) and mongoStatic({ extensions }); otherwise they fail with RUNTIME.MISSING_EXTENSION_PACK. A MongoDB contract.json must have "target"; every contract prisma contract emit writes has it. Extension authors: createMongoExecutionContext checks the contract against the stack, a MongoDB descriptor declares each codec once as a codec descriptor instead of in a codecs() slot, and mongoStandardCodecs and buildStandardCodecRegistry are removed. See mongo-client-takes-extensions and mongo-contract-requires-target in the app recipe, and mongo-execution-context-checks-contract-requirements, mongo-codecs-declared-once and mongo-standard-codecs-removed in the extension recipe. (#30943)

    Before:

    export const db = mongo({ contract, url });
    

    After:

    import myPack from 'my-mongo-pack/runtime';
    export const db = mongo({ contract, url, extensions: [myPack] });
    

    supabase() and postgres() check their database input when they are called. A wrong input fails with RUNTIME.BINDING_INVALID at once, not on the first query. Passing both url and pg to supabase() fails; before, pg won silently. An empty url, or one that is not postgres:// or postgresql://, fails; before, an empty one connected with the PG* environment variables or to localhost. null as pg, url or binding fails, even beside another input, so leave the option out instead. A binding of an unknown kind fails. supabase() refuses a pg.Client with the message "Supabase takes a pg.Pool or a url, not a pg.Client". See supabase-one-binding-input and postgres-checks-database-input in the app recipe. (#30920)

    Before:

    postgres({ contract, url: process.env['DATABASE_URL'] ?? null });
    

    After:

    const url = process.env['DATABASE_URL'];
    postgres({ contract, ...(url === undefined ? {} : { url }) });
    

    On PostgreSQL, seven scalar type names are deprecated, and two column helpers are renamed. SmallInt, BigIntNumber, Numeric, UnboundedInt, Real, VarChar and VarBit still work but report the warning PSL_DEPRECATED_SCALAR_NAME. Write the convenience type that gives the same type instead, such as String(storage: varchar, length: 12) for VarChar(12); the contract does not change. The same TypeScript helpers, such as type.VarChar(...), are deprecated too. The column helpers int8Column and numericColumn are renamed int8BigIntColumn and numericStringColumn, and the old names are removed. Extension authors: postgresScalarAuthoringTypes, postgresNativeAuthoringTypes and postgresScalarAndNativeTypeConstructors are replaced by postgresScalarTypes and postgresExplicitTypes. See psl-renamed-postgres-scalar-types, ts-renamed-postgres-scalar-helpers and ts-renamed-postgres-column-helpers in the app recipe, and the same ids plus ts-renamed-postgres-type-groupings in the extension recipe. (#30942)

    Before:

    model Account {
      id Int @id
      visits SmallInt
      price Numeric(10, 2)
      code VarChar(12)
    }
    

    After:

    model Account {
      id Int @id
      visits Int(storage: int2)
      price Decimal(precision: 10, scale: 2)
      code String(storage: varchar, length: 12)
    }
    

    temporal-polyfill is a peer dependency of the MySQL and SQLite packages. The MySQL and SQLite control planes, such as the prisma commands, now import it. npm, pnpm and bun install it for you. A project that installs with Yarn adds temporal-polyfill (^1.0.4) to its dependencies. A MySQL DateTime field now refuses to write a year before 1000 or after 9999 with RUNTIME.ENCODE_FAILED. On SQLite, db verify reads a database default of date('now') as the current date, so it matches only a Date @default(now()) field. Extension authors: mysqlCreateNamespace, MysqlDatabase, sqliteCreateNamespace and SqliteUnboundDatabase move from the target's /target/control entry to its /target/types entry. See temporal-polyfill-is-a-peer-dependency-of-mysql, mysql-datetime-writes-are-checked and temporal-polyfill-is-a-peer-dependency-of-sqlite in the app recipe, and the same ids plus mysql-create-namespace-moved-to-target-types and sqlite-create-namespace-moved-to-target-types in the extension recipe. (#30922, #30950)

    Features

    On PostgreSQL, Int, BigInt, Float, Decimal, String, Boolean and Bytes are convenience types, as DateTime is. Each is named for what a field means, and its optional storage argument (and as, for BigInt) chooses an explicit type named after the database type, such as Int(storage: int2) for Int2 or BigInt(as: number) for Int8Number. Written bare, each gives the same type as before, so every existing schema emits the same contract. (#30942)

    SQLite and MySQL get the convenience types DateTime, Date, Time and Duration. as: chooses the value the application reads, such as a JavaScript Date, a string or a Temporal value, and on MySQL storage: chooses the column, such as DateTime(storage: timestamp). A bare DateTime is the type DateTime was before, so every existing SQLite and MySQL contract emits the same. (#30922, #30950)

    ORM create, update, upsert and delete work on MySQL and return the written rows, as on PostgreSQL. MySQL has no RETURNING, so the ORM writes and then reads the rows back by their key in the same transaction. (#30927)

    Migration statements cover value objects and variants on PostgreSQL and SQLite. prisma migration plan and db update take --rename GeoPoint.lat:GeoPoint.latitude, --delete GeoPoint.lng and --backfill GeoPoint.country for a value object field, rename or delete an enum value a value object holds, and take --convert Bug or --delete Bug for a variant whose discriminator value changed or that was removed. Each statement acts on every column that holds the value object. A failed migration's rowsHoldingValue detail is now a list of every removal whose check failed. (#30929)

    supabase() takes the options postgres() takes, including cursor, which streams rows from a server-side cursor, and binding. (#30920)

    A Supabase database whose pgvector, PostGIS, ParadeDB or citext extension lives in schema extensions adopts Prisma 8 with prisma contract emit and prisma db sign. (#30956)

    Fixes

    Prisma ORM no longer refuses to start when it is loaded from more than one copy. RUNTIME.MULTIPLE_ORM_COPIES, added in 8.0.0-rc.22, is removed for now, because a host that loads the ORM in two module instances, such as Prisma Composer's boot wrapper beside the app bundle, cannot satisfy it. A narrower check may return later. Installing one version of every @prisma/orm-* package is still required: values made by one copy are not recognised by another. (#30961)

    A released Supabase role session resets its role. Before, its connection went back to the pool still running as the session's role, such as authenticated, so the next user of that connection ran under that role. (#30920)

    On MySQL, stopping a stream early on a large result no longer ends the process with an unhandled rejection. The driver interrupts the statement itself before it closes the connection. (#30931)

    Original source
  • Nov 6, 2026
    • Date parsed from source:
      Nov 6, 2026
    • First seen by Releasebot:
      Nov 7, 2026
    Prisma logo

    Prisma

    v8.0.0-rc.23-dev.1: chore(release): bump to 8.0.0-rc.23 (#30962)

    Prisma ships 8.0.0-rc.23 with new convenience types, MySQL ORM and migration capabilities, expanded Supabase options, and improved MongoDB behavior. The release also fixes Supabase and MySQL issues and removes a startup check that blocked multiple ORM copies.

    8.0.0-rc.22 → 8.0.0-rc.23

    Merging this PR ships the release. The push to main carries the new root version. The Publish to npm workflow then publishes 8.0.0-rc.23 under the dist-tag latest and creates a pre-release GitHub Release. See docs/oss/versioning.md.

    What to review

    Release notes: docs/releases/v8.0.0-rc.23.md, mirrored at the top of CHANGELOG.md. Seven breaking changes, then features and fixes. The fixes include the removal of the RUNTIME.MULTIPLE_ORM_COPIES check (#30961), which unblocks Prisma Composer.

    Upgrade guides, assembled from the nine pending fragments:

    • app: skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.22-to-8.0.0-rc.23/instructions.md
    • extension: skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.22-to-8.0.0-rc.23/instructions.md

    The originals moved unchanged to upgrade-instructions/releases/8.0.0-rc.22-to-8.0.0-rc.23/sources/. The mongo-index-names script is copied into the app guide, and its test and five detection tests now read the published guides.

    Merges worth a look: the two MongoDB index fragments share one app section, and the extension guide gives one call order for nameIndexes, mergeRedundantIndexes and the builder.

    Version bump: every workspace package.json, the workspace: specifiers in pnpm-lock.yaml, the library_version stamp in skills/prisma-8/SKILL.md, and the Supabase contract version stamps. Nothing else.

    Checks run

    • pnpm check:upgrade-coverage --mode publish --prev v8.0.0-rc.22 --head HEAD: passes.
    • pnpm check:release-notes --mode pr: passes.
    • pnpm install --frozen-lockfile: passes.

    Docs site

    prisma/web#8770 updates the Prisma 8 pages for this release. It merges after 8.0.0-rc.23 is on npm under latest.

    Recipe links in the notes point at the v8.0.0-rc.23 tag, which the publish creates, so they fail link checks until then.

    Agent: cerridwen-44
    🤖 Generated with Claude Code

    Summary by CodeRabbit

    New Features

    Added convenience types, MySQL ORM writes, migration statements for value objects and variants, and expanded Supabase options.

    Improved MongoDB index naming and reader behavior, extension-pack handling, and database-input validation.

    Bug Fixes

    Fixed Supabase role-session resets and early MySQL stream termination.

    Removed startup refusal when multiple ORM copies are present.

    Documentation

    Added Prisma 8.0.0-rc.23 upgrade guidance and release notes, including breaking changes and migration steps.

    Signed-off-by: willbot [email protected]

    Signed-off-by: Will Madden [email protected]

    Original source
  • All of your release notes in one feed

    Join Releasebot and get updates from Prisma and hundreds of other software products.

    Create account
  • Nov 6, 2026
    • Date parsed from source:
      Nov 6, 2026
    • First seen by Releasebot:
      Nov 7, 2026
    Prisma logo

    Prisma

    v8.0.0-rc.22-dev.15

    Prisma ORM fixes a startup issue that occurred when a second copy was involved.

    TML-3807: Prisma ORM no longer refuses to start when a second copy is…

    Original source
  • Nov 6, 2026
    • Date parsed from source:
      Nov 6, 2026
    • First seen by Releasebot:
      Nov 7, 2026
    Prisma logo

    Prisma

    v8.0.0-rc.22-dev.13

    Prisma updates MongoDB migrations to create and drop indexes by name.

    TML-3762: MongoDB migrations create and drop each index by its name, …

    Original source
  • Nov 6, 2026
    • Date parsed from source:
      Nov 6, 2026
    • First seen by Releasebot:
      Nov 7, 2026
    Prisma logo

    Prisma

    v8.0.0-rc.22-dev.12

    Prisma adds MySQL convenience types for DateTime, Date, and Time.

    TML-3787: MySQL gets the convenience types DateTime, Date, Time and D…

    Original source
  • Similar to Prisma with recent updates:

  • Nov 6, 2026
    • Date parsed from source:
      Nov 6, 2026
    • First seen by Releasebot:
      Nov 7, 2026
    Prisma logo

    Prisma

    v8.0.0-rc.22-dev.11

    Prisma enables ORM create, update, upsert, and delete operations on MySQL.

    TML-3696: ORM create, update, upsert and delete work on MySQL and ret…

    Original source
  • Nov 6, 2026
    • Date parsed from source:
      Nov 6, 2026
    • First seen by Releasebot:
      Nov 7, 2026
    Prisma logo

    Prisma

    v8.0.0-rc.22-dev.10

    Prisma improves CLI updates by having ORM releases notify prisma-cli immediately.

    TML-3513: An ORM release tells prisma-cli at once, so the CLI follows…

    Original source
  • Nov 6, 2026
    • Date parsed from source:
      Nov 6, 2026
    • First seen by Releasebot:
      Nov 7, 2026
    Prisma logo

    Prisma

    v8.0.0-rc.22-dev.9

    Prisma improves migration statements for renaming, removing, and filling value object fields.

    TML-3537: Migration statements rename, remove and fill value object f…

    Original source
  • Nov 5, 2026
    • Date parsed from source:
      Nov 5, 2026
    • First seen by Releasebot:
      Nov 5, 2026
    Prisma logo

    Prisma

    v8.0.0-rc.22-dev.7

    Prisma adds support for PostgreSQL options in `supabase()`, making its configuration more consistent with `postgres()`.

    TML-3682: supabase() takes the options postgres() takes, and a releas…

    Original source
  • Nov 2, 2026
    • Date parsed from source:
      Nov 2, 2026
    • First seen by Releasebot:
      Nov 2, 2026
    Prisma logo

    Prisma

    v8.0.0-rc.22-dev.5

    Prisma adds SQLite convenience types for DateTime, Date, and Time.

    TML-3780: SQLite gets the convenience types DateTime, Date, Time and …

    Original source
  • Nov 2, 2026
    • Date parsed from source:
      Nov 2, 2026
    • First seen by Releasebot:
      Nov 2, 2026
    Prisma logo

    Prisma

    v8.0.0-rc.22-dev.3

    Prisma notes an rc.22 change in which contract inference writes a convenience date.

    docs: the rc.22 notes say contract infer writes the convenience date

    Original source
  • Nov 2, 2026
    • Date parsed from source:
      Nov 2, 2026
    • First seen by Releasebot:
      Nov 2, 2026
    Prisma logo

    Prisma

    v8.0.0-rc.22-dev.2

    Prisma fixes MySQL statement interruption to prevent issues when its connection is destroyed.

    fix(mysql): interrupt a statement before destroying its connection, s…

    Original source
  • Oct 30, 2026
    • Date parsed from source:
      Oct 30, 2026
    • First seen by Releasebot:
      Nov 2, 2026
    Prisma logo

    Prisma

    v8.0.0-rc.22

    Prisma ships v8.0.0-rc.22 with expanded PostgreSQL and MySQL support, simpler date and time types, stronger database checks, and safer client connections. The release also modernizes MongoDB execution and includes migration guidance for breaking changes.

    v8.0.0-rc.22

    On PostgreSQL, DateTime, Date, Time and the new Duration are convenience types whose defaults read a JavaScript Date or a string, with no Temporal polyfill. Value objects move into the storage plane, so changing one is a migration, and Postgres checks value object and discriminator columns. MongoDB's query builder, raw lane, ORM and runtime take an execution context, as SQL's do, and a MongoDB client creates its driver from the execution stack. A contract can declare the Postgres extensions it needs, so db sign adopts a database that uses pgvector, PostGIS, ParadeDB or the new citext pack. The Prisma 7 reader now reads every Postgres @db.* type Prisma 7 accepts. MySQL gets ORM and SQL builder reads. Prisma ORM refuses to run from two installed copies, and connect() on a client is safe to call again.

    The upgrade recipes for this hop: the app recipe and the extension recipe. Each breaking change below names the change ids to look for in them. The app recipe opens with the order to do the steps in. After upgrading, run prisma contract emit once, so a contract that an extension such as Supabase stamps with its version matches the installed package (contract-artifacts-restamp in the app recipe).

    Breaking changes

    On PostgreSQL, DateTime, Date and Time are convenience types with new defaults. Each is named for what a field means and becomes one explicit type, chosen by its optional as, storage and precision arguments. At its default, DateTime is a timestamptz(3) column read as a JavaScript Date, Date reads a string such as "2024-02-29", Time reads a string such as "09:30:00", and the new Duration reads an ISO 8601 duration such as "P1M". Until now the three names read Temporal values. To keep a field as it is, rename DateTime to TimestamptzTemporal, Date to DateTemporal and Time to TimeTemporal; in TypeScript, call type.TimestamptzTemporal(...), type.DateTemporal() and type.TimeTemporal(...). temporal.CreatedAt and temporal.UpdatedAt are now built on the new DateTime, and their String and JsDate variants are removed. A contract read by prisma7Schema(...) now reads a Prisma 7 DateTime field as a Date, as Prisma 7 did, so run prisma db sign after re-emitting it. On PostgreSQL and MySQL, a column read as a Date, such as MySQL's DateTime, refuses a default with digits below a millisecond. The rest of this change is PostgreSQL only: SQLite, MySQL and MongoDB keep their date and time types. contract infer and contract print now write the convenience types: a timestamptz(3) column is DateTime, a timestamptz column DateTime(precision: 6), a timestamp(3) column DateTime(storage: timestamp), date is Date, time is Time and interval is Duration. So a contract you infer again reads a timestamptz field as a Date, where it read an ISO 8601 string, and drops its microseconds; add as: string, as in DateTime(as: string, precision: 6), to keep the string. See psl-date-time-types-are-convenience-types, ts-date-time-helpers-are-convenience-types, temporal-type-aliases-on-datetime, prisma7-schema-reads-dates and date-default-below-a-millisecond in the app recipe. (#30847)

    Before:

    model Event {
      id      Int  @id
      at      DateTime
      day     Date
      opensAt Time(0)
    }
    

    After, to keep each field and its contract:

    model Event {
      id      Int  @id
      at      TimestamptzTemporal
      day     DateTemporal
      opensAt TimeTemporal(0)
    }
    

    Value objects are storage entities, and Postgres checks their columns. A contract keeps its value objects at storage.namespaces.<ns>.entries.valueObject, and a field names one by its storage coordinate, so changing a value object changes the storage hash and is a migration. On SQL, a discriminator column names a value set of its variants' values, and a discriminator field is typed by those values, such as 'bug' | 'feature'. On a managed Postgres table, the contract derives a check for each value object column and each discriminator column; the next migration plan adds them, and db migrate fails on a row that does not fit. A contract.json that keeps valueObjects in the domain plane is refused with CONTRACT.VALIDATION_FAILED. The app recipe ships a script that rewrites every contract, snapshot and migration that names one; run it, then sign each database before you re-emit. Extension authors: ValueObjectTypesFromDomain is now ValueObjectTypesFromStorage, FieldTypesFromDomain takes the storage namespaces as a sixth argument, ValueObjectFieldType is renamed ValueObjectReference, and a Postgres codec descriptor declares jsonType. See value-objects-in-storage, value-object-types-from-storage, postgres-value-object-checks and discriminator-typed-by-variant-values in the app recipe, and mongo-result-shapes-read-storage, postgres-check-expression-types-move, field-types-read-storage-value-objects, value-object-reference-type and postgres-codec-json-type in the extension recipe. (#30869)

    MongoDB's query builder, raw lane, ORM and runtime take an execution context. mongoQuery, mongoRaw and mongoOrm take { context } instead of { contract }, as sql({ context }) and the SQL ORM do. A context comes from mongoStatic({ contract }) or mongo({ contract }), which validate the contract once. mongoOrm takes { context, runtime } and no longer takes executor, enums or mutationDefaults. createMongoRuntime takes { context, adapter, driver }. buildMongoEnums, MongoEnumAccessors, MongoOrmEnums and ORM.MUTATION_DEFAULTS_MISSING are removed. Extension authors: createSqlExecutionStack(...) returns SqlExecutionStackWithDriver, whose driver is always set, only when given a driver. See mongo-query-takes-context, mongo-orm-takes-context and mongo-runtime-takes-adapter in the app recipe, and the same ids plus sql-stack-with-driver-requires-driver in the extension recipe. (#30865)

    Before:

    import { mongoQuery } from '@prisma/orm-mongo/query-builder';
    const query = mongoQuery({ contract });
    const raw = mongoRaw({ contract });
    

    After:

    import mongoStatic from '@prisma/orm-mongo/static';
    const { query, raw } = mongoStatic({ contract });
    

    A MongoDB driver is created from its descriptor. createMongoDriver and MongoDriverImpl are no longer exported. Put the runtime driver descriptor, the default export of @prisma/orm-mongo/driver/runtime, on the execution stack, create the driver from the stack, and connect it. An application that calls mongo({ contract, url }) sees no difference. Extension authors: MongoDriver gains connect(binding), and code that only sends commands takes the new MongoQueryable. See mongo-driver-from-runtime-descriptor in the app recipe, and mongo-driver-from-runtime-descriptor and mongo-driver-connect in the extension recipe. (#30906)

    Before:

    import { createMongoDriver } from '@prisma/orm-mongo/driver';
    const driver = await createMongoDriver(url, dbName);
    

    After:

    import mongoRuntimeDriver from '@prisma/orm-mongo/driver/runtime';
    const stack = createMongoExecutionStack({ target, adapter, driver: mongoRuntimeDriver });
    const driver = stack.driver.create();
    await driver.connect({ kind: 'url', url, dbName });
    

    The pgvector, PostGIS and ParadeDB packs declare their Postgres extension, and contract emit writes each pack's files. Each pack's contract now declares its extension, and its head no longer requires an install invariant. prisma contract emit writes each composed pack's head ref, contract snapshot and migrations under migrations/<space-id>/, as migration plan already did: commit them, then run prisma db migrate on each database to move the pack's marker. db sign now refuses a contract space whose head requires an invariant its marker does not record, with MIGRATION.SIGN_INVARIANTS_MISSING. Extension authors: declare a pack's extension in its contract instead of installing it with installExtension(...) and an invariant. See contract-emit-pins-pack-files and packs-declare-their-postgres-extension in the app recipe, and declare-postgres-extension-in-pack-contract in the extension recipe. (#30902)

    Prisma ORM refuses to run from two installed copies. Every command and client now stops with RUNTIME.MULTIPLE_ORM_COPIES, naming each copy and where it is, when more than one copy of Prisma ORM is installed. Before, such a project could fail later with an internal error, for example on the first literal default in contract emit. Install one version of every @prisma/orm-* package and a prisma CLI that runs it. See one-orm-version in the app recipe. (#30883)

    MongoDB merges identical and redundant indexes in a collection. A unique and a plain index on the same keys, such as @unique and @@index on one field, now give one unique index, and identical indexes, which TypeScript and PSL refused before, give one. Before, the contract held both indexes of such a pair and the migration that created them failed with MIGRATION.PRECHECK_FAILED. Re-emit the contract, and replace a planned migration that creates both indexes. Extension authors: BuildRefusal loses the kind indexDuplicate, and indexLookupKey, MONGO_INDEX_OPTION_KEYS, MongoIndexOptionKey and canonicalize move from @prisma/orm-family-mongo/schema-ir to @prisma/orm-family-mongo/contract. See mongo-merged-redundant-indexes in the app recipe, and mongo-build-refusal-index-duplicate-removed and mongo-index-lookup-key-moved in the extension recipe. (#30894)

    Features

    connect() without options on a postgres(), sqlite(), mysql() or mongo() client is safe to call again: it waits for a connection in progress, or resolves with the runtime the client's queries already use. connect(options) on a bound client still rejects with DRIVER.ALREADY_CONNECTED, now with the message <Target> client is already bound. See client-connect-safe-to-call-again in the app recipe. (#30899)

    A Postgres contract can declare the extensions it needs, with extension pg_trgm {} in PSL or extension('pg_trgm') in TypeScript, at the top level or in a namespace. db verify checks them, the planner creates them, and contract infer and contract print write them. The Prisma 7 reader reads the datasource extensions list, so a Prisma 7 database that uses pgvector, PostGIS or ParadeDB adopts Prisma 8 with contract emit and db sign. (#30902)

    A new package, @prisma/orm-postgres-contrib, holds a citext extension pack: the PSL type citext.Citext, which compares case-insensitively. The Prisma 7 reader reads @db.Citext as citext.Citext when the config composes the pack, and refuses it with PSL.PRISMA7_EXTENSION_PACK_MISSING, naming the import to add, when it does not. Every Postgres @db.* type Prisma 7 accepts is now read. (#30904)

    PostgreSQL gains the types Xml, Oid and Money, and the Prisma 7 reader reads @db.Bit, @db.VarBit, @db.Xml, @db.Oid and @db.Money. The Postgres driver sets lc_monetary=C on every connection and writes money through numeric, so money reads and writes the same value in any locale. (#30900)

    MySQL gets ORM and SQL builder reads, including nested and ordered includes, through @prisma/orm-mysql/runtime and @prisma/orm-mysql/static. The MySQL drivers run on the mariadb package, which writes each value into the statement with its own escaping, so Prisma's code never puts a value into SQL and each statement takes one round trip. (#30863, #30893, #30918)

    Prisma's extension packages list the npm keyword prisma-orm-extension, so a search for it finds them next to community extensions. (#30892)

    Fixes

    On PostgreSQL, the now generator of a timestamp column read as a Date or a Temporal value rounds the time down to the column's precision, so the value a create returns is the value PostgreSQL stores. Before, a timestamp(0) column could store a time one second after the write. Re-emit the contract; only the execution hash changes. See date-now-takes-column-precision in the app recipe. (#30847)

    The diagnostic for a Prisma 7 @db.* attribute in a Prisma 8 schema suggests the constructor Prisma 8 renamed it to, such as String for @db.Text, instead of a type that does not exist. (#30909)

    Original source
  • Oct 30, 2026
    • Date parsed from source:
      Oct 30, 2026
    • First seen by Releasebot:
      Nov 2, 2026
    Prisma logo

    Prisma

    v8.0.0-rc.22-dev.1: chore(release): bump to 8.0.0-rc.22 (#30919)

    Prisma releases version 8.0.0-rc.22 with new PostgreSQL and MySQL capabilities, repeatable client connections, and updates to MongoDB APIs, storage, and indexes. The release includes bug fixes and upgrade guides for its breaking changes.

    8.0.0-rc.21 → 8.0.0-rc.22. See versioning.

    Publishing was broken and is fixed. From 23 October every Publish to npm run on main failed with ENEEDAUTH on three packages that had never been on npm: @prisma/orm-mysql, @prisma/orm-target-mysql (#30856) and @prisma/orm-postgres-contrib (#30904). Trusted publishing cannot authenticate a package that does not exist yet. They were published once by hand and given a trusted publisher; the re-run of run 41053844815 then published all three from CI. The failed runs had also skipped the rc.21 git tag and GitHub Release, which the upgrade-coverage check needs to find the previous release.

    v8.0.0-rc.21 now exists at the rc.21 release commit fad17c1d03.

    Merging this PR ships the release. The push to main carries the new root version. The Publish to npm workflow then publishes 8.0.0-rc.22 under the latest dist-tag and creates a pre-release GitHub Release.

    What to review

    Release notes:

    docs/releases/v8.0.0-rc.22.md, mirrored in CHANGELOG.md. Seven breaking changes: the PostgreSQL convenience date and time types (#30847), value objects in storage (#30869), the MongoDB execution context (#30865), the MongoDB driver descriptor (#30906), packs declaring their Postgres extension (#30902), one installed copy of Prisma ORM (#30883) and merged MongoDB indexes (#30894). Six features and two fixes. The notes leave out #30728 (telemetry backend), #30891 (CI), #30901 (tests), and #30862, #30895, #30897 and #30898 (docs only).

    Upgrade guides:

    skills/prisma-8/upgrading/{app,extension}/upgrades/8.0.0-rc.21-to-8.0.0-rc.22/instructions.md, assembled from the fifteen pending fragments (the fifteenth, from #30918, declares no change). The app guide has 19 changes plus the Supabase restamp, opens with the order to do the steps in, and ships one script (value-objects-in-storage). The extension guide has 16 changes. None was dropped. The originals are archived unchanged under upgrade-instructions/releases/8.0.0-rc.21-to-8.0.0-rc.22/sources/.

    Corrections made while assembling:

    mongo-runtime-takes-adapter said createMongoExecutionStack() no longer takes a driver. #30906, merged later, gave it one back, and the driver entry tells you to pass it. The entry now says what main does, and its detection no longer flags a stack built with a driver.

    The convenience types entry now says to leave a DateTime(as: ...) field alone, and the step order renames the old types before rewriting the temporal.* aliases. Otherwise an agent would rename the DateTime(as: temporal) the alias table writes.

    References to "this release's guide" now name the rc.20 → rc.21 guide they meant.

    Tests:

    The upgrade-instruction tests read the published guides and script. The value-objects-in-storage tests no longer call live framework code: the two tests that checked the fixtures against this release's serializers are removed, and the one hash they computed is a recorded constant.

    Version bump:

    every package.json, pnpm-lock.yaml (workspace specifiers only), the skill's library_version, and the Supabase contract version stamps.

    Checks run locally

    • check:upgrade-coverage --mode publish --prev fad17c1d03 --head HEAD: pass. The --mode pr form CI runs passes now that the tag exists.
    • check:release-notes --mode pr: pass
    • lint:skills: pass
    • test/upgrade-instructions: 102 files, 1,980 tests pass

    The prisma/web docs PR follows once this is published.

    Agent: paddington-54

    🤖 Generated with Claude Code

    Summary by CodeRabbit

    New Features

    Added repeatable client connect() behavior, PostgreSQL extension declarations and additional types, plus MySQL ORM and SQL-builder read support.

    Breaking Changes

    PostgreSQL date/time defaults and types, value-object storage, MongoDB APIs and indexes, and extension-pack migrations have changed. Review the upgrade guidance before updating.

    Bug Fixes

    Improved precision for PostgreSQL now() values and clarified Prisma 7 @db.* diagnostics.

    Documentation

    Added Prisma 8.0.0-rc.22 release notes and upgrade instructions.

    Signed-off-by: willbot [email protected]

    Signed-off-by: Will Madden [email protected]

    Co-authored-by: Claude Opus 5.5 [email protected]

    Original source
  • Oct 30, 2026
    • Date parsed from source:
      Oct 30, 2026
    • First seen by Releasebot:
      Nov 2, 2026
    Prisma logo

    Prisma

    v8.0.0-rc.21-dev.23

    Prisma sends each MySQL statement in a single round trip.

    feat(mysql): send each MySQL statement in one round trip, with the ma…

    Original source
Releasebot

Curated by the Releasebot team

Releasebot is an aggregator of official release notes from hundreds of software vendors and thousands of sources.

Our editorial process involves the manual review and audit of release notes procured with the help of automated systems.