From ba1cc7cee83eddad8963fb63ef93556b62837783 Mon Sep 17 00:00:00 2001 From: Jon Harrell <4829245+jharrell@users.noreply.github.com> Date: Thu, 20 Mar 2025 18:42:57 -0500 Subject: [PATCH 1/2] try to find references to ORM v4 and lower --- .../500-databases/800-sql-server/index.mdx | 2 +- .../500-databases/850-planetscale.mdx | 12 +- .../10-overview/04-location.mdx | 2 +- .../20-relations/100-one-to-one-relations.mdx | 2 +- .../200-one-to-many-relations.mdx | 2 +- .../410-referential-actions/index.mdx | 185 +- .../20-relations/420-relation-mode.mdx | 6 - .../20-data-model/30-indexes.mdx | 24 +- .../20-data-model/40-views.mdx | 2 +- .../70-unsupported-database-features.mdx | 19 +- .../100-prisma-schema/50-introspection.mdx | 2 +- .../80-postgresql-extensions.mdx | 6 - .../100-queries/030-crud.mdx | 2 +- .../056-aggregation-grouping-summarizing.mdx | 2 +- .../100-queries/058-transactions.mdx | 32 +- .../100-queries/060-full-text-search.mdx | 2 +- .../100-queries/062-computed-fields.mdx | 74 - .../150-using-raw-sql/200-raw-queries.mdx | 28 +- .../150-using-raw-sql/index.mdx | 2 +- .../057-composite-types.mdx | 13 +- .../100-working-with-json-fields.mdx | 20 +- .../300-client-extensions/100-model.mdx | 16 - .../300-client-extensions/110-client.mdx | 10 - .../300-client-extensions/120-query.mdx | 10 - .../300-client-extensions/130-result.mdx | 10 - .../500-middleware/index.mdx | 12 +- .../300-client-extensions/index.mdx | 10 - .../400-type-safety/index.mdx | 6 - .../600-legacy-migrate.mdx | 466 ----- .../300-workflows/10-seeding.mdx | 2 - .../120-native-database-functions.mdx | 29 +- content/200-orm/400-tools/05-prisma-cli.mdx | 2 +- .../050-prisma-client-reference.mdx | 144 +- .../100-prisma-schema-reference.mdx | 152 +- .../200-prisma-cli-reference.mdx | 32 +- .../500-reference/250-error-reference.mdx | 2 - .../300-environment-variables-reference.mdx | 42 - .../700-upgrading-to-prisma-4.mdx | 495 ----- .../100-named-constraints.mdx | 165 -- .../150-referential-actions.mdx | 206 -- .../800-upgrading-to-prisma-3/index.mdx | 161 -- .../200-upgrading-versions/index.mdx | 12 +- .../01-how-to-upgrade.mdx | 137 -- .../02-schema-incompatibilities-mysql.mdx | 776 -------- ...02-schema-incompatibilities-postgresql.mdx | 777 -------- .../03-upgrading-the-prisma-layer-mysql.mdx | 1311 ------------- ...-upgrading-the-prisma-layer-postgresql.mdx | 1321 ------------- .../04-upgrading-nexus-prisma-to-nexus.mdx | 774 -------- .../05-upgrading-prisma-binding-to-nexus.mdx | 1329 ------------- ...-upgrading-prisma-binding-to-sdl-first.mdx | 1692 ----------------- .../07-upgrading-a-rest-api.mdx | 251 --- .../08-upgrade-from-mongodb-beta.mdx | 232 --- .../images/TablePlus-GUI.png | Bin 165631 -> 0 bytes ...missing-default-constraints-to-columns.png | Bin 131401 -> 0 bytes .../images/altering-columns-to-use-enum.png | Bin 212604 -> 0 bytes .../images/download-graphql-schema.png | Bin 586217 -> 0 bytes ...xpose-prisma-model-fields-with-t-model.png | Bin 39518 -> 0 bytes .../fix-columns-with-json-data-types.png | Bin 132890 -> 0 bytes .../fix-incorrect-m-n-relations-sql.png | Bin 193876 -> 0 bytes .../images/fix-schema-incompatibilities.png | Bin 50051 -> 0 bytes .../images/prisma-cli-introspection-flow.png | Bin 30299 -> 0 bytes .../regenerate-resolvers-with-t-crud.png | Bin 71855 -> 0 bytes .../run-sql-command-to-alter-column.png | Bin 120846 -> 0 bytes .../use-t-crud-to-generate-resolvers.png | Bin 48878 -> 0 bytes .../800-upgrade-from-prisma-1/index.mdx | 11 - ...-comparing-columns-through-raw-queries.mdx | 211 -- .../20-style-guide/02-word-choice.mdx | 20 +- 67 files changed, 109 insertions(+), 11156 deletions(-) delete mode 100644 content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/600-legacy-migrate.mdx delete mode 100644 content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/700-upgrading-to-prisma-4.mdx delete mode 100644 content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/100-named-constraints.mdx delete mode 100644 content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/150-referential-actions.mdx delete mode 100644 content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/index.mdx delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/01-how-to-upgrade.mdx delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities-mysql.mdx delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities-postgresql.mdx delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer-mysql.mdx delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer-postgresql.mdx delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/04-upgrading-nexus-prisma-to-nexus.mdx delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/05-upgrading-prisma-binding-to-nexus.mdx delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/06-upgrading-prisma-binding-to-sdl-first.mdx delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/07-upgrading-a-rest-api.mdx delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/08-upgrade-from-mongodb-beta.mdx delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/TablePlus-GUI.png delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/add-missing-default-constraints-to-columns.png delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/altering-columns-to-use-enum.png delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/download-graphql-schema.png delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/expose-prisma-model-fields-with-t-model.png delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/fix-columns-with-json-data-types.png delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/fix-incorrect-m-n-relations-sql.png delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/fix-schema-incompatibilities.png delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/prisma-cli-introspection-flow.png delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/regenerate-resolvers-with-t-crud.png delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/run-sql-command-to-alter-column.png delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/use-t-crud-to-generate-resolvers.png delete mode 100644 content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/index.mdx delete mode 100644 content/200-orm/800-more/600-help-and-troubleshooting/500-comparing-columns-through-raw-queries.mdx diff --git a/content/200-orm/050-overview/500-databases/800-sql-server/index.mdx b/content/200-orm/050-overview/500-databases/800-sql-server/index.mdx index 50138a1066..ca31197f0f 100644 --- a/content/200-orm/050-overview/500-databases/800-sql-server/index.mdx +++ b/content/200-orm/050-overview/500-databases/800-sql-server/index.mdx @@ -70,7 +70,7 @@ sqlserver://HOST[:PORT];database=DATABASE;user={MyServer/MyUser};password={ThisI | `socketTimeout` | No | | Number of seconds to wait for each query to succeed. | | `isolationLevel` | No | | Sets [transaction isolation level](https://learn.microsoft.com/en-us/sql/t-sql/statements/set-transaction-isolation-level-transact-sql?view=sql-server-ver15). | | `poolTimeout` | No | `10` | Maximum number of seconds to wait for a new connection from the pool. If all connections are in use, the database will return a `PoolTimeout` error after waiting for the given time. | -| (case insensitive) | No | | Sets the application name for the connection. Since version 2.28.0. | +| (case insensitive) | No | | Sets the application name for the connection. | | `trustServerCertificate` | No | `false` | Configures whether to trust the server certificate. | | `trustServerCertificateCA` | No | | A path to a certificate authority file to be used instead of the system certificates to authorize the server certificate. Must be either in `pem`, `crt` or `der` format. Cannot be used together with `trustServerCertificate` parameter. | diff --git a/content/200-orm/050-overview/500-databases/850-planetscale.mdx b/content/200-orm/050-overview/500-databases/850-planetscale.mdx index 51c8cda807..a3f9ecd398 100644 --- a/content/200-orm/050-overview/500-databases/850-planetscale.mdx +++ b/content/200-orm/050-overview/500-databases/850-planetscale.mdx @@ -65,9 +65,7 @@ If you try to push to a production branch, you will get the [error message](/orm #### 1. Set `relationMode = "prisma"` -PlanetScale does not use foreign key constraints in its database schema by default. However, Prisma ORM relies on foreign key constraints in the underlying database to enforce referential integrity between models in your Prisma schema. - -In Prisma ORM versions 3.1.1 and later, you can [emulate relations in Prisma Client with the `prisma` relation mode](/orm/prisma-schema/data-model/relations/relation-mode#emulate-relations-in-prisma-orm-with-the-prisma-relation-mode), which avoids the need for foreign key constraints in the database. +PlanetScale does not use foreign key constraints in its database schema by default. However, Prisma ORM relies on foreign key constraints in the underlying database to enforce referential integrity between models in your Prisma schema. You can [emulate relations in Prisma Client with the `prisma` relation mode](/orm/prisma-schema/data-model/relations/relation-mode#emulate-relations-in-prisma-orm-with-the-prisma-relation-mode), which avoids the need for foreign key constraints in the database. To enable emulation of relations in Prisma Client, set the `relationMode` field to `"prisma"` in the `datasource` block: @@ -79,12 +77,6 @@ datasource db { } ``` - - -The ability to set the relation mode was introduced as part of the `referentialIntegrity` preview feature in Prisma ORM version 3.1.1, and is generally available in Prisma ORM versions 4.8.0 and later.

The `relationMode` field was renamed in Prisma ORM version 4.5.0, and was previously named `referentialIntegrity`. - -
- If you use relations in your Prisma schema with the default `"foreignKeys"` option for the `relationMode` field, PlanetScale will error and Prisma ORM output the [P3021 error message](/orm/reference/error-reference#p3021) when it tries to create foreign keys. (In versions before 2.27.0 it will output a raw database error.) #### 2. Create indexes on foreign keys @@ -134,7 +126,7 @@ model Comment { You can then add this change to your schema [using `db push`](#how-to-make-schema-changes-with-db-push). -In versions 4.7.0 and later, Prisma ORM warns you if you have a relation with no index on the relation scalar field. For more information, see [Index validation](/orm/prisma-schema/data-model/relations/relation-mode#index-validation). +Prisma ORM will warn you if you have a relation with no index on the relation scalar field. For more information, see [Index validation](/orm/prisma-schema/data-model/relations/relation-mode#index-validation). diff --git a/content/200-orm/100-prisma-schema/10-overview/04-location.mdx b/content/200-orm/100-prisma-schema/10-overview/04-location.mdx index ce40444b4f..0a8dfd2852 100644 --- a/content/200-orm/100-prisma-schema/10-overview/04-location.mdx +++ b/content/200-orm/100-prisma-schema/10-overview/04-location.mdx @@ -18,7 +18,7 @@ The Prisma CLI looks for the Prisma Schema in the following locations, in the fo prisma generate --schema=./alternative/schema.prisma ``` -2. The location specified in the `package.json` file (version 2.7.0 and later): +2. The location specified in the `package.json` file: ```json "prisma": { diff --git a/content/200-orm/100-prisma-schema/20-data-model/20-relations/100-one-to-one-relations.mdx b/content/200-orm/100-prisma-schema/20-data-model/20-relations/100-one-to-one-relations.mdx index 577a7a80e8..3423fed06e 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/20-relations/100-one-to-one-relations.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/20-relations/100-one-to-one-relations.mdx @@ -95,7 +95,7 @@ model Profile { -In MySQL, you can create a foreign key with only an index on the referenced side, and not a unique constraint. In Prisma ORM versions 4.0.0 and later, if you introspect a relation of this type it will trigger a validation error. To fix this, you will need to add a `@unique` constraint to the referenced field. +In MySQL, you can create a foreign key with only an index on the referenced side, and not a unique constraint. If you introspect a relation of this type it will trigger a validation error. To fix this, you will need to add a `@unique` constraint to the referenced field. diff --git a/content/200-orm/100-prisma-schema/20-data-model/20-relations/200-one-to-many-relations.mdx b/content/200-orm/100-prisma-schema/20-data-model/20-relations/200-one-to-many-relations.mdx index 8a46de8dec..48cff7ae91 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/20-relations/200-one-to-many-relations.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/20-relations/200-one-to-many-relations.mdx @@ -93,7 +93,7 @@ model Post { -In MySQL, you can create a foreign key with only an index on the referenced side, and not a unique constraint. In Prisma ORM versions 4.0.0 and later, if you introspect a relation of this type it will trigger a validation error. To fix this, you will need to add a `@unique` constraint to the referenced field. +In MySQL, you can create a foreign key with only an index on the referenced side, and not a unique constraint. If you introspect a relation of this type it will trigger a validation error. To fix this, you will need to add a `@unique` constraint to the referenced field. diff --git a/content/200-orm/100-prisma-schema/20-data-model/20-relations/410-referential-actions/index.mdx b/content/200-orm/100-prisma-schema/20-data-model/20-relations/410-referential-actions/index.mdx index 2e0d6ccc7f..d635b61a60 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/20-relations/410-referential-actions/index.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/20-relations/410-referential-actions/index.mdx @@ -5,21 +5,7 @@ metaDescription: 'Referential actions let you define the update and delete behav tocDepth: 3 --- - - -Referential actions determine what happens to a record when your application deletes or updates a related record. - -From version 2.26.0, you can define referential actions on the relation fields in your Prisma schema. This allows you to define referential actions like cascading deletes and cascading updates at a Prisma ORM level. - - - -**Version differences** - -- If you use version 3.0.1 or later, you can use referential actions as described on this page. -- If you use a version between 2.26.0 and 3.0.0, you can use referential actions as described on this page, but you must [enable the preview feature flag](/orm/reference/preview-features/client-preview-features#enabling-a-prisma-client-preview-feature) `referentialActions`. -- If you use version 2.25.0 or earlier, you can configure cascading deletes manually in your database. - - +Referential actions determine what happens to a record when your application deletes or updates a related record. You can define referential actions on the relation fields in your Prisma schema. This allows you to define referential actions like cascading deletes and cascading updates at a Prisma ORM level. In the following example, adding `onDelete: Cascade` to the `author` field on the `Post` model means that deleting the `User` record will also delete all related `Post` records. @@ -39,15 +25,6 @@ model User { If you do not specify a referential action, Prisma ORM [uses a default](#referential-action-defaults). - - - - -If you upgrade from a version earlier than 2.26.0: -It is extremely important that you check the [upgrade paths for referential actions](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/referential-actions) section. Prisma ORM's support of referential actions **removes the safety net in Prisma Client that prevents cascading deletes at runtime**. If you use the feature _without upgrading your database_, the [old default action](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/referential-actions#prisma-orm-2x-default-referential-actions) - `ON DELETE CASCADE` - becomes active. This might result in cascading deletes that you did not expect. - - - ## What are referential actions? Referential actions are policies that define how a referenced record is handled by the database when you run an [`update`](/orm/prisma-client/queries/crud#update) or [`delete`](/orm/prisma-client/queries/crud#delete) query. @@ -160,12 +137,11 @@ The following table shows which referential action each database supports. | SQLite | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | SQL Server | ✔️ | ❌‡ | ✔️ | ✔️ | ✔️ | | CockroachDB | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| MongoDB†† | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | +| MongoDB | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | - † See [special cases for MySQL](#mysqlmariadb). - ⌘ See [special cases for PostgreSQL](#postgresql). - ‡ See [special cases for SQL Server](#sql-server). -- †† Referential actions for MongoDB are available in Prisma ORM versions 3.7.0 and later. ### Special cases for referential actions @@ -270,7 +246,7 @@ The `NoAction` action is similar to `Restrict`, the difference between the two i - **MySQL**: `NoAction` behaves exactly the same as `Restrict`. See [the MySQL docs](https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html#foreign-key-referential-actions) for more information. - **SQLite**: When a related primary key is modified or deleted, no action is taken. See [the SQLite docs](https://www.sqlite.org/foreignkeys.html#fk_actions) for more information. - **SQL Server**: When a referenced record is deleted or modified, an error is raised. See [the SQL Server docs](https://learn.microsoft.com/en-us/sql/relational-databases/tables/graph-edge-constraints?view=sql-server-ver15#on-delete-referential-actions-on-edge-constraints) for more information. -- **MongoDB** (in preview from version 3.6.0): When a record is modified or deleted, nothing is done to any related records. +- **MongoDB**: When a record is modified or deleted, nothing is done to any related records. @@ -361,158 +337,3 @@ When the `username` of a `User` changes, its existing posts' `authorUsername` fi ### Database-specific requirements MongoDB and SQL Server have specific requirements for referential actions if you have [self-relations](/orm/prisma-schema/data-model/relations/referential-actions/special-rules-for-referential-actions#self-relation-sql-server-and-mongodb) or [cyclic relations](/orm/prisma-schema/data-model/relations/referential-actions/special-rules-for-referential-actions#cyclic-relation-between-three-tables-sql-server-and-mongodb) in your data model. SQL Server also has specific requirements if you have relations with [multiple cascade paths](/orm/prisma-schema/data-model/relations/referential-actions/special-rules-for-referential-actions#multiple-cascade-paths-between-two-models-sql-server-only). - -## Upgrade paths from versions 2.25.0 and earlier - -There are a couple of paths you can take when upgrading which will give different results depending on the desired outcome. - -If you currently use the migration workflow, you can run an introspection to check how the defaults are reflected in your schema. You can then manually update your database if you need to. - -You can also decide to skip checking the defaults and run a migration to update your database with the [new default values](#referential-action-defaults). - -The following assumes you have upgraded to 2.26.0 or newer and enabled the preview feature flag, or upgraded to 3.0.0 or newer: - -### Using Introspection - -If you [Introspect](/orm/prisma-schema/introspection) your database, the referential actions configured at the database level will be reflected in your Prisma Schema. If you have been using Prisma Migrate or `prisma db push` to manage the database schema, these are likely to be the [default values](#referential-action-defaults) from 2.25.0 and earlier. - -When you run an Introspection, Prisma ORM compares all the foreign keys in the database with the schema, if the SQL statements `ON DELETE` and `ON UPDATE` do **not** match the default values, they will be explicitly set in the schema file. - -After introspecting, you can review the non-default clauses in your schema. The most important clause to review is `onDelete`, which defaults to `Cascade` in 2.25.0 and earlier. - - - -If you are using either the [`delete()`](/orm/prisma-client/queries/crud#delete-a-single-record) or [`deleteMany()`](/orm/prisma-client/queries/crud#delete-all-records) methods, **[cascading deletes](#how-to-use-cascading-deletes) will now be performed** as the `referentialActions` preview feature **removed the safety net in Prisma Client that previously prevented cascading deletes at runtime**. Be sure to check your code and make any adjustments accordingly. - - - -Make sure you are happy with every case of `onDelete: Cascade` in your schema. If not, either: - -- Modify your Prisma schema and `db push` or `dev migrate` to change the database - -_or_ - -- Manually update the underlying database if you use an introspection-only workflow - -The following example would result in a cascading delete, if the `User` is deleted then all of their `Post`'s will be deleted too. - -#### A blog schema example - -```prisma showLineNumbers -model Post { - id Int @id @default(autoincrement()) - title String - //add-next-line - author User @relation(fields: [authorId], references: [id], onDelete: Cascade) - authorId Int -} - -model User { - id Int @id @default(autoincrement()) - posts Post[] -} -``` - -### Using Migration - -When running a [Migration](/orm/prisma-migrate) (or the [`prisma db push`](/orm/prisma-migrate/workflows/prototyping-your-schema) command) the [new defaults](#referential-action-defaults) will be applied to your database. - - - -Unlike when you run an Introspect for the first time, the new referential actions clause and property, will **not** automatically be added to your prisma schema by the Prisma VSCode extension. -You will have to manually add them if you wish to use anything other than the new defaults. - - - -Explicitly defining referential actions in your Prisma schema is optional. If you do not explicitly define a referential action for a relation, Prisma ORM uses the [new defaults](#referential-action-defaults). - -Note that referential actions can be added on a case by case basis. This means that you can add them to one single relation and leave the rest set to the defaults by not manually specifying anything. - -### Checking for errors - -**Before** upgrading to 2.26.0 and enabling the referential actions **preview feature**, Prisma ORM prevented the deletion of records while using `delete()` or `deleteMany()` to preserve referential integrity. A custom runtime error would be thrown by Prisma Client with the error code `P2014`. - -**After** upgrading and enabling the referential actions **preview feature**, Prisma ORM no longer performs runtime checks. You can instead specify a custom referential action to preserve the referential integrity between relations. - -When you use [`NoAction`](#noaction) or [`Restrict`](#restrict) to prevent the deletion of records, the error messages will be different post 2.26.0 compared to pre 2.26.0. This is because they are now triggered by the database and **not** Prisma Client. The new error code that can be expected is `P2003`. - -To make sure you catch these new errors you can adjust your code accordingly. - -#### Example of catching errors - -The following example uses the below blog schema with a one-to-many relationship between `Post` and `User` and sets a [`Restrict`](#restrict) referential actions on the `author` field. - -This means that if a user has a post, that user (and their posts) **cannot** be deleted. - -```prisma file=schema.prisma showLineNumbers -model Post { - id Int @id @default(autoincrement()) - title String - author User @relation(fields: [authorId], references: [id], onDelete: Restrict) - authorId String -} - -model User { - id Int @id @default(autoincrement()) - posts Post[] -} -``` - -Prior to upgrading and enabling the referential actions **preview feature**, the error code you would receive when trying to delete a user which has posts would be `P2014` and it's message: - -> "The change you are trying to make would violate the required relation '\{relation_name}' between the \{model_a_name\} and \{model_b_name\} models." - -```ts -import { PrismaClient } from '@prisma/client' - -const prisma = new PrismaClient() - -async function main() { - try { - await prisma.user.delete({ - where: { - id: 'some-long-id', - }, - }) - } catch (error) { - if (error instanceof Prisma.PrismaClientKnownRequestError) { - if (error.code === 'P2014') { - console.log(error.message) - } - } - } -} - -main() -``` - -To make sure you are checking for the correct errors in your code, modify your check to look for `P2003`, which will deliver the message: - -> "Foreign key constraint failed on the field: \{field_name\}" - -```ts highlight=14;delete|15;add -import { PrismaClient } from '@prisma/client' - -const prisma = new PrismaClient() - -async function main() { - try { - await prisma.user.delete({ - where: { - id: 'some-long-id' - } - }) - } catch (error) { - if (error instanceof Prisma.PrismaClientKnownRequestError) { - //delete-next-line - if (error.code === 'P2014') { - //add-next-line - if (error.code === 'P2003') { - console.log(error.message) - } - } - } -} - -main() -``` diff --git a/content/200-orm/100-prisma-schema/20-data-model/20-relations/420-relation-mode.mdx b/content/200-orm/100-prisma-schema/20-data-model/20-relations/420-relation-mode.mdx index a054e7d778..6ab732cc97 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/20-relations/420-relation-mode.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/20-relations/420-relation-mode.mdx @@ -85,12 +85,6 @@ datasource db { } ``` - - -The ability to set the relation mode was introduced as part of the `referentialIntegrity` preview feature in Prisma ORM version 3.1.1, and is generally available in Prisma ORM versions 4.8.0 and later.

The `relationMode` field was renamed in Prisma ORM version 4.5.0, and was previously named `referentialIntegrity`. - -
- For relational databases, the available options are: - `foreignKeys`: this handles relations in the database with foreign keys. This is the default option for all relational database connectors and is active if no `relationMode` is explicitly set in the `datasource` block. diff --git a/content/200-orm/100-prisma-schema/20-data-model/30-indexes.mdx b/content/200-orm/100-prisma-schema/20-data-model/30-indexes.mdx index 958ad1c732..a098645cd0 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/30-indexes.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/30-indexes.mdx @@ -48,7 +48,7 @@ See the linked sections for details of which version each feature was first intr The `length` argument is specific to MySQL and allows you to define indexes and constraints on columns of `String` and `Byte` types. For these types, MySQL requires you to specify a maximum length for the subpart of the value to be indexed in cases where the full value would exceed MySQL's limits for index sizes. See [the MySQL documentation](https://dev.mysql.com/doc/refman/8.0/en/innodb-limits.html) for more details. -The `length` argument is available on the `@id`, `@@id`, `@unique`, `@@unique` and `@@index` attributes. It is generally available in versions 4.0.0 and later, and available as part of the `extendedIndexes` preview feature in versions 3.5.0 and later. +The `length` argument is available on the `@id`, `@@id`, `@unique`, `@@unique` and `@@index` attributes. As an example, the following data model declares an `id` field with a maximum length of 3000 characters: @@ -95,7 +95,7 @@ A similar syntax can be used for the `@@unique` and `@@index` attributes. The `sort` argument is available for all databases supported by Prisma ORM. It allows you to specify the order that the entries of the index or constraint are stored in the database. This can have an effect on whether the database is able to use an index for specific queries. -The `sort` argument is available for all databases on `@unique`, `@@unique` and `@@index`. Additionally, SQL Server also allows it on `@id` and `@@id`. It is generally available in versions 4.0.0 and later, and available as part of the `extendedIndexes` preview feature in versions 3.5.0 and later. +The `sort` argument is available for all databases on `@unique`, `@@unique` and `@@index`. Additionally, SQL Server also allows it on `@id` and `@@id`. As an example, the following table @@ -144,7 +144,7 @@ model Post { ### Configuring the access type of indexes with `type` (PostgreSQL) -The `type` argument is available for configuring the index type in PostgreSQL with the `@@index` attribute. The index access methods available are `Hash`, `Gist`, `Gin`, `SpGist` and `Brin`, as well as the default `BTree` index access method. The `type` argument is generally available in versions 4.0.0 and later. The `Hash` index access method is available as part of the `extendedIndexes` preview feature in versions 3.6.0 and later, and the `Gist`, `Gin`, `SpGist` and `Brin` index access methods are available in preview in versions 3.14.0 and later. +The `type` argument is available for configuring the index type in PostgreSQL with the `@@index` attribute. The index access methods available are `Hash`, `Gist`, `Gin`, `SpGist` and `Brin`, as well as the default `BTree` index access method. #### Hash @@ -414,7 +414,7 @@ Read more about built-in operator classes in the [official PostgreSQL documentat ### Configuring if indexes are clustered or non-clustered with `clustered` (SQL Server) -The `clustered` argument is available to configure (non)clustered indexes in SQL Server. It can be used on the `@id`, `@@id`, `@unique`, `@@unique` and `@@index` attributes. It is generally available in versions 4.0.0 and later, and available as part of the `extendedIndexes` preview feature in versions 3.13.0 and later. +The `clustered` argument is available to configure (non)clustered indexes in SQL Server. It can be used on the `@id`, `@@id`, `@unique`, `@@unique` and `@@index` attributes. As an example, the following model configures the `@id` to be non-clustered (instead of the clustered default): @@ -466,13 +466,13 @@ In each of the cases above unwanted changes to your database can be prevented by ## Full text indexes (MySQL and MongoDB) -The `fullTextIndex` preview feature provides support for introspection and migration of full text indexes in MySQL and MongoDB in version 3.6.0 and later. This can be configured using the `@@fulltext` attribute. Existing full text indexes in the database are added to your Prisma schema after introspecting with `db pull`, and new full text indexes added in the Prisma schema are created in the database when using Prisma Migrate. This also prevents validation errors in some database schemas that were not working before. +The `fullTextIndex` preview feature provides support for introspection and migration of full text indexes in MySQL and MongoDB. This can be configured using the `@@fulltext` attribute. Existing full text indexes in the database are added to your Prisma schema after introspecting with `db pull`, and new full text indexes added in the Prisma schema are created in the database when using Prisma Migrate. This also prevents validation errors in some database schemas that were not working before. - +:::warning For now we do not enable the full text search commands in Prisma Client for MongoDB; the progress can be followed in the [MongoDB](https://github.com/prisma/prisma/issues/9413) issue. - +::: ### Enabling the `fullTextIndex` preview feature @@ -520,13 +520,3 @@ model Post { @@fulltext([title(sort: Desc), content]) } ``` - -### Upgrading from previous versions - - - -This can be a **breaking change** when activating the functionality for certain, existing Prisma schemas for existing databases. After enabling the preview features required to use them, run `prisma db pull` to introspect the existing database to update your Prisma schema before using Prisma Migrate again. - - - -Earlier versions of Prisma ORM converted full text indexes using the `@@index` attribute rather than the `@@fulltext` attribute. After enabling the `fullTextIndex` preview feature, run `prisma db pull` to convert these indexes to `@@fulltext` before migrating again with Prisma Migrate. If you do not do this, the existing indexes will be dropped instead and normal indexes will be created in their place. diff --git a/content/200-orm/100-prisma-schema/20-data-model/40-views.mdx b/content/200-orm/100-prisma-schema/20-data-model/40-views.mdx index f78802b4ef..f4cfa54db3 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/40-views.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/40-views.mdx @@ -294,7 +294,7 @@ When re-introspecting your database, any custom changes to your view definitions #### The `views` directory -Introspection of a database with one or more existing views will also create a new `views` directory within your `prisma` directory (starting with Prisma version 4.12.0). This directory will contain a subdirectory named after your database's schema which contains a `.sql` file for each view that was introspected in that schema. Each file will be named after an individual view and will contain the query the related view defines. +Introspection of a database with one or more existing views will also create a new `views` directory within your `prisma` directory. This directory will contain a subdirectory named after your database's schema which contains a `.sql` file for each view that was introspected in that schema. Each file will be named after an individual view and will contain the query the related view defines. For example, after introspecting a database with the default `public` schema using the model used above you will find a `prisma/views/public/UserInfo.sql` file was created with the following contents: diff --git a/content/200-orm/100-prisma-schema/20-data-model/70-unsupported-database-features.mdx b/content/200-orm/100-prisma-schema/20-data-model/70-unsupported-database-features.mdx index a620d29f68..5c3be56c34 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/70-unsupported-database-features.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/70-unsupported-database-features.mdx @@ -53,24 +53,7 @@ In PostgreSQL, some native database functions are part of an extension. For exam To use a PostgreSQL extension, you must first install it on the file system of your database server. -In Prisma ORM versions 4.5.0 and later, you can then activate the extension by declaring it in your Prisma schema with the [`postgresqlExtensions` preview feature](/orm/prisma-schema/postgresql-extensions): - -```prisma file=schema.prisma highlight=3,9;add showLineNumbers -generator client { - provider = "prisma-client-js" - //add-next-line - previewFeatures = ["postgresqlExtensions"] -} - -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") - //add-next-line - extensions = [pgcrypto] -} -``` - -In earlier versions of Prisma ORM, you must instead run a SQL command to activate the extension: +You must instead run a SQL command to activate the extension: ```sql CREATE EXTENSION IF NOT EXISTS pgcrypto; diff --git a/content/200-orm/100-prisma-schema/50-introspection.mdx b/content/200-orm/100-prisma-schema/50-introspection.mdx index 0e76630d80..f3e13a73a7 100644 --- a/content/200-orm/100-prisma-schema/50-introspection.mdx +++ b/content/200-orm/100-prisma-schema/50-introspection.mdx @@ -315,7 +315,7 @@ Note that you can rename the [Prisma-ORM level](/orm/prisma-schema/data-model/re ## Introspection with an existing schema -Running `prisma db pull` for relational databases with an existing Prisma Schema merges manual changes made to the schema, with changes made in the database. (This functionality has been added for the first time with version 2.6.0.) For MongoDB, Introspection for now is meant to be done only once for the initial data model. Running it repeatedly will lead to loss of custom changes, as the ones listed below. +Running `prisma db pull` for relational databases with an existing Prisma Schema merges manual changes made to the schema, with changes made in the database. For MongoDB, Introspection is meant to be done only once for the initial data model. Running it repeatedly will lead to loss of custom changes, as the ones listed below. Introspection for relational databases maintains the following manual changes: diff --git a/content/200-orm/100-prisma-schema/80-postgresql-extensions.mdx b/content/200-orm/100-prisma-schema/80-postgresql-extensions.mdx index 56fb3cf0b1..c6cedb0099 100644 --- a/content/200-orm/100-prisma-schema/80-postgresql-extensions.mdx +++ b/content/200-orm/100-prisma-schema/80-postgresql-extensions.mdx @@ -8,12 +8,6 @@ tocDepth: 3 This page introduces PostgreSQL extensions and describes how to represent extensions in your Prisma schema, how to introspect existing extensions in your database, and how to apply changes to your extensions to your database with Prisma Migrate. - - -Support for declaring PostgreSQL extensions in your schema is available in preview for the PostgreSQL connector only in Prisma versions 4.5.0 and later. - - - ## What are PostgreSQL extensions? PostgreSQL allows you to extend your database functionality by installing and activating packages known as _extensions_. For example, the `citext` extension adds a case-insensitive string data type. Some extensions, such as `citext`, are supplied directly by PostgreSQL, while other extensions are developed externally. For more information on extensions, see [the PostgreSQL documentation](https://www.postgresql.org/docs/current/sql-createextension.html). diff --git a/content/200-orm/200-prisma-client/100-queries/030-crud.mdx b/content/200-orm/200-prisma-client/100-queries/030-crud.mdx index 09dba52754..0a2b469368 100644 --- a/content/200-orm/200-prisma-client/100-queries/030-crud.mdx +++ b/content/200-orm/200-prisma-client/100-queries/030-crud.mdx @@ -790,7 +790,7 @@ const upsertUser = await prisma.user.upsert({ -From version 4.6.0, Prisma Client carries out upserts with database native SQL commands where possible. [Learn more](/orm/reference/prisma-client-reference#database-upserts). +Prisma Client carries out upserts with database native SQL commands where possible. [Learn more](/orm/reference/prisma-client-reference#database-upserts). diff --git a/content/200-orm/200-prisma-client/100-queries/056-aggregation-grouping-summarizing.mdx b/content/200-orm/200-prisma-client/100-queries/056-aggregation-grouping-summarizing.mdx index c0695ef1ab..5461812f40 100644 --- a/content/200-orm/200-prisma-client/100-queries/056-aggregation-grouping-summarizing.mdx +++ b/content/200-orm/200-prisma-client/100-queries/056-aggregation-grouping-summarizing.mdx @@ -390,7 +390,7 @@ The `_count` parameter: - Can be used inside a top-level `include` _or_ `select` - Can be used with any query that returns records (including `delete`, `update`, and `findFirst`) - Can return [multiple relation counts](#return-multiple-relation-counts) -- Can [filter relation counts](#filter-the-relation-count) (from version 4.3.0) +- Can [filter relation counts](#filter-the-relation-count) #### Return a relations count with `include` diff --git a/content/200-orm/200-prisma-client/100-queries/058-transactions.mdx b/content/200-orm/200-prisma-client/100-queries/058-transactions.mdx index 63b93505b5..f9009ce132 100644 --- a/content/200-orm/200-prisma-client/100-queries/058-transactions.mdx +++ b/content/200-orm/200-prisma-client/100-queries/058-transactions.mdx @@ -13,12 +13,6 @@ A database transaction refers to a sequence of read/write operations that are _g ## Transactions overview - - -Before Prisma ORM version 4.4.0, you could not set isolation levels on transactions. The isolation level in your database configuration always applied. - - - Developers take advantage of the safety guarantees provided by the database by wrapping the operations in a transaction. These guarantees are often summarized using the ACID acronym: - **Atomic**: Ensures that either _all_ or _none_ operations of the transactions succeed. The transaction is either _committed_ successfully or _aborted_ and _rolled back_. @@ -175,7 +169,7 @@ Instead of immediately awaiting the result of each operation when it's performed > > Refer to the section about the [transactions API](#transaction-api) for more examples. -From version 4.4.0, the sequential operations transaction API has a second parameter. You can use the following optional configuration option in this parameter: +You can use the following optional configuration option in this parameter: - `isolationLevel`: Sets the [transaction isolation level](#transaction-isolation-level). By default this is set to the value currently configured in your database. @@ -199,14 +193,6 @@ await prisma.$transaction( Sometimes you need more control over what queries execute within a transaction. Interactive transactions are meant to provide you with an escape hatch. - - -Interactive transactions have been generally available from version 4.7.0. - -If you use interactive transactions in preview from version 2.29.0 to 4.6.1 (inclusive), you need to add the `interactiveTransactions` preview feature to the generator block of your Prisma schema. - - - To use interactive transactions, you can pass an async function into [`$transaction`](#transaction-api). The first argument passed into this async function is an instance of Prisma Client. Below, we will call this instance `tx`. Any Prisma Client call invoked on this `tx` instance is encapsulated into the transaction. @@ -344,14 +330,6 @@ This feature is not available on MongoDB, because MongoDB does not support isola You can set the transaction [isolation level](https://www.prisma.io/dataguide/intro/database-glossary#isolation-levels) for transactions. - - -This is available in the following Prisma ORM versions for interactive transactions from version 4.2.0, for sequential operations from version 4.4.0. - -In versions before 4.2.0 (for interactive transactions), or 4.4.0 (for sequential operations), you cannot configure the transaction isolation level at a Prisma ORM level. Prisma ORM does not explicitly set the isolation level, so the [isolation level configured in your database](#database-specific-information-on-isolation-levels) is used. - - - #### Set the isolation level To set the transaction isolation level, use the `isolationLevel` option in the second parameter of the API. @@ -1170,13 +1148,11 @@ If a ❌ conflict occurs (someone else has changed the record since you read it) This section describes how to build your own optimistic concurrency control. See also: Plans for [application-level optimistic concurrency control on GitHub](https://github.com/prisma/prisma/issues/4988) - - -- If you use version 4.4.0 or earlier, you cannot use optimistic concurrency control on `update` operations, because you cannot filter on non-unique fields. The `version` field you need to use with optimistic concurrency control is a non-unique field. +:::info -- Since version 5.0.0 you are able to [filter on non-unique fields in `update` operations](/orm/reference/prisma-client-reference#filter-on-non-unique-fields-with-userwhereuniqueinput) so that optimistic concurrency control is being used. The feature was also available via the Preview flag `extendedWhereUnique` from versions 4.5.0 to 4.16.2. +- Since Prisma ORM version 5.0.0 you are able to [filter on non-unique fields in `update` operations](/orm/reference/prisma-client-reference#filter-on-non-unique-fields-with-userwhereuniqueinput) so that optimistic concurrency control is being used. - +::: #### When to use optimistic concurrency control diff --git a/content/200-orm/200-prisma-client/100-queries/060-full-text-search.mdx b/content/200-orm/200-prisma-client/100-queries/060-full-text-search.mdx index ef473c95b8..e2f7ba9a06 100644 --- a/content/200-orm/200-prisma-client/100-queries/060-full-text-search.mdx +++ b/content/200-orm/200-prisma-client/100-queries/060-full-text-search.mdx @@ -5,7 +5,7 @@ metaDescription: 'This page explains how to search for text within a field.' sidebar_class_name: preview-badge --- -Prisma Client supports full-text search for **PostgreSQL** databases in versions 2.30.0 and later, and **MySQL** databases in versions 3.8.0 and later. With full-text search (FTS) enabled, you can add search functionality to your application by searching for text within a database column. +Prisma Client supports full-text search for **PostgreSQL** and **MySQL** database. With full-text search (FTS) enabled, you can add search functionality to your application by searching for text within a database column. :::info diff --git a/content/200-orm/200-prisma-client/100-queries/062-computed-fields.mdx b/content/200-orm/200-prisma-client/100-queries/062-computed-fields.mdx index c1e69e2dcd..31b8115e31 100644 --- a/content/200-orm/200-prisma-client/100-queries/062-computed-fields.mdx +++ b/content/200-orm/200-prisma-client/100-queries/062-computed-fields.mdx @@ -99,80 +99,6 @@ model Post { The computed fields are type-safe and can return anything from a concatenated value to complex objects or functions that can act as an instance method for your models. -
- -Instructions prior to Prisma ORM 4.16.0 - -:::warning - -With Prisma Client extensions Generally Available as of Prisma ORM version 4.16.0, the following steps are not recommended. Please use [a client extension](#using-a-prisma-client-extension) to accomplish this. - -::: - -Prisma Client does not yet natively support computed fields, but, you can define a function that accepts a generic type as an input then extend that generic to ensure it conforms to a specific structure. Finally, you can return that generic with additional computed fields. Let's see how that might look: - - - - - -```tsx -// Define a type that needs a first and last name -type FirstLastName = { - firstName: string - lastName: string -} - -// Extend the T generic with the fullName attribute -type WithFullName = T & { - fullName: string -} - -// Take objects that satisfy FirstLastName and computes a full name -function computeFullName( - user: User -): WithFullName { - return { - ...user, - fullName: user.firstName + ' ' + user.lastName, - } -} - -async function main() { - const user = await prisma.user.findUnique({ where: 1 }) - const userWithFullName = computeFullName(user) -} -``` - - - - - -```js -function computeFullName(user) { - return { - ...user, - fullName: user.firstName + ' ' + user.lastName, - } -} - -async function main() { - const user = await prisma.user.findUnique({ where: 1 }) - const userWithFullName = computeFullName(user) -} -``` - - - - - -In the TypeScript example above, a `User` generic has been defined that extends the `FirstLastName` type. This means that whatever you pass into `computeFullName` must contain `firstName` and `lastName` keys. - -A `WithFullName` return type has also been defined, which takes whatever `User` is and tacks on a `fullName` string attribute. - -With this function, any object that contains `firstName` and `lastName` keys can compute a `fullName`. Pretty neat, right? - -
- ### Going further - Learn how you can use [Prisma Client extensions](/orm/prisma-client/client-extensions) to add a computed field to your schema — [example](https://github.com/prisma/prisma-client-extensions/tree/main/computed-fields). diff --git a/content/200-orm/200-prisma-client/150-using-raw-sql/200-raw-queries.mdx b/content/200-orm/200-prisma-client/150-using-raw-sql/200-raw-queries.mdx index e0ff6126d1..f166418d7e 100644 --- a/content/200-orm/200-prisma-client/150-using-raw-sql/200-raw-queries.mdx +++ b/content/200-orm/200-prisma-client/150-using-raw-sql/200-raw-queries.mdx @@ -333,15 +333,6 @@ $executeRawUnsafe(query: string, ...values: any[]): PrismaPromise - -**Feature availability:** - -- In v3.14.x and v3.15.x, raw query type mapping was available with the preview feature `improvedQueryRaw`. We made raw query type mapping [Generally Available](/orm/more/releases#generally-available-ga) in version 4.0.0, so you do not need to use `improvedQueryRaw` in version 4.0.0 or later. -- Before version 4.0.0, raw query type mapping was not available for SQLite. - -
- As an example, take a raw query that selects columns with `BigInt`, `Bytes`, `Decimal` and `Date` types from a table: @@ -412,26 +403,9 @@ The solution in this case is to explicitly cast `42` to the `text` type: await prisma.$queryRaw`SELECT LENGTH(${42}::text);`; ``` -:::info - -**Feature availability:** This funtionality is [Generally Available](/orm/more/releases#generally-available-ga) since version 4.0.0. In v3.14.x and v3.15.x, it was available with the preview feature `improvedQueryRaw`. - -For the example above before version 4.0.0, Prisma ORM silently coerces `42` to `text` and does not require the explicit cast. - -On the other hand the following raw query now works correctly, returning an integer result, and failed before: - -```ts -await prisma.$queryRaw`SELECT ${1.5}::int as int`; - -// Now: [{ int: 2 }] -// Before: db error: ERROR: incorrect binary data format in bind parameter 1 -``` - -::: - ### Transactions -In 2.10.0 and later, you can use `.$executeRaw()` and `.$queryRaw()` inside a [transaction](/orm/prisma-client/queries/transactions). +You can use `.$executeRaw()` and `.$queryRaw()` inside a [transaction](/orm/prisma-client/queries/transactions). ### Using variables diff --git a/content/200-orm/200-prisma-client/150-using-raw-sql/index.mdx b/content/200-orm/200-prisma-client/150-using-raw-sql/index.mdx index b598c28e4c..1b102dccce 100644 --- a/content/200-orm/200-prisma-client/150-using-raw-sql/index.mdx +++ b/content/200-orm/200-prisma-client/150-using-raw-sql/index.mdx @@ -66,6 +66,6 @@ For MongoDB, Prisma ORM supports three methods to execute raw queries: These methods allow you to execute raw MongoDB commands and queries, providing flexibility when you need to use MongoDB-specific features or optimizations. -`$runCommandRaw` is used to execute database commands, `.findRaw` is used to find documents that match a filter, and `.aggregateRaw` is used for aggregation operations. All three methods are available from Prisma version 3.9.0 and later. +`$runCommandRaw` is used to execute database commands, `.findRaw` is used to find documents that match a filter, and `.aggregateRaw` is used for aggregation operations. Similar to raw queries in relational databases, these methods are not type-safe and require manual handling of the query results. \ No newline at end of file diff --git a/content/200-orm/200-prisma-client/200-special-fields-and-types/057-composite-types.mdx b/content/200-orm/200-prisma-client/200-special-fields-and-types/057-composite-types.mdx index fb67569058..47fee42e38 100644 --- a/content/200-orm/200-prisma-client/200-special-fields-and-types/057-composite-types.mdx +++ b/content/200-orm/200-prisma-client/200-special-fields-and-types/057-composite-types.mdx @@ -15,8 +15,6 @@ Composite types are only available with MongoDB. [Composite types](/orm/prisma-schema/data-model/models#defining-composite-types), known as [embedded documents](https://www.mongodb.com/docs/manual/data-modeling/#embedded-data) in MongoDB, allow you to embed records within other records. -We made composite types [Generally Available](/orm/more/releases#generally-available-ga) in v3.12.0. They were previously available in [Preview](/orm/reference/preview-features) from v3.10.0. - This page explains how to: - [find](#finding-records-that-contain-composite-types-with-find-and-findmany) records that contain composite types using `findFirst` and `findMany` @@ -97,7 +95,7 @@ There are currently some limitations when using composite types in Prisma Client ## Default values for required fields on composite types -From version 4.0.0, if you carry out a database read on a composite type when all of the following conditions are true, then Prisma Client inserts the default value into the result. +If you carry out a database read on a composite type when all of the following conditions are true, then Prisma Client inserts the default value into the result. Conditions: @@ -131,15 +129,6 @@ console.dir(await prisma.product.findMany({}), { depth: Infinity }) The `bitDepth` field has no content because you have only just added this field, so the query returns the default value of `8`. -** Earlier versions ** - -Before version 4.0.0, Prisma ORM threw a P2032 error as follows: - -``` -Error converting field "bitDepth" of expected non-nullable -type "int", found incompatible value of "null". -``` - ## Finding records that contain composite types with `find` and `findMany` Records can be filtered by a composite type within the `where` operation. diff --git a/content/200-orm/200-prisma-client/200-special-fields-and-types/100-working-with-json-fields.mdx b/content/200-orm/200-prisma-client/200-special-fields-and-types/100-working-with-json-fields.mdx index c8591a7f59..faed63123f 100644 --- a/content/200-orm/200-prisma-client/200-special-fields-and-types/100-working-with-json-fields.mdx +++ b/content/200-orm/200-prisma-client/200-special-fields-and-types/100-working-with-json-fields.mdx @@ -144,21 +144,11 @@ const getUsers = await prisma.user.findMany({ You can also filter rows by the data inside a `Json` field. We call this **advanced `Json` filtering**. This functionality is supported by [PostgreSQL](/orm/overview/databases/postgresql) and [MySQL](/orm/overview/databases/mysql) only with [different syntaxes for the `path` option](#path-syntax-depending-on-database). - +:::warning PostgreSQL does not support [filtering on object key values in arrays](#filtering-on-object-key-value-inside-array). - - - - -The availability of advanced `Json` filtering depends on your Prisma version: - -- v4.0.0 or later: advanced `Json` filtering is [generally available](/orm/more/releases#generally-available-ga). -- From v2.23.0, but before v4.0.0: advanced `Json` filtering is a [preview feature](/orm/reference/preview-features/client-preview-features). Add `previewFeatures = ["filterJson"]` to your schema. [Learn more](/orm/reference/preview-features/client-preview-features#enabling-a-prisma-client-preview-feature). -- Before v2.23.0: you can [filter on the exact `Json` field value](#filter-on-exact-field-value), but you cannot use the other features described in this section. - - +::: ### `path` syntax depending on database @@ -890,12 +880,6 @@ To differentiate between these possibilities, we've introduced three _null enums -From v4.0.0, `JsonNull`, `DbNull`, and `AnyNull` are objects. Before v4.0.0, they were strings. - - - - - - When filtering using any of the _null enums_ you can not use a shorthand and leave the `equals` operator off. - These _null enums_ do not apply to MongoDB because there the difference between a JSON `null` and a database `NULL` does not exist. - The _null enums_ do not apply to the `array_contains` operator in all databases because there can only be a JSON `null` within a JSON array. Since there cannot be a database `NULL` within a JSON array, `{ array_contains: null }` is not ambiguous. diff --git a/content/200-orm/200-prisma-client/300-client-extensions/100-model.mdx b/content/200-orm/200-prisma-client/300-client-extensions/100-model.mdx index f245f1ba7e..f7e0c71364 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/100-model.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/100-model.mdx @@ -5,14 +5,6 @@ metaDescription: 'Extend the functionality of Prisma Client, model component' toc_max_heading_level: 4 --- - - - - -Prisma Client extensions are Generally Available from versions 4.16.0 and later. They were introduced in Preview in version 4.7.0. Make sure you enable the `clientExtensions` Preview feature flag if you are running on a version earlier than 4.16.0. - - - You can use the `model` [Prisma Client extensions](/orm/prisma-client/client-extensions) component type to add custom methods to your models. Possible uses for the `model` component include the following: @@ -22,8 +14,6 @@ Possible uses for the `model` component include the following: - Repetitive operations - Model-specific utilities - - ## Add a custom method Use the `$extends` [client-level method](/orm/reference/prisma-client-reference#client-methods) to create an _extended client_. An extended client is a variant of the standard Prisma Client that is wrapped by one or more extensions. Use the `model` extension component to add methods to models in your schema. @@ -134,12 +124,6 @@ const prisma = new PrismaClient().$extends({ ## Get the current model name at runtime - - -This feature is available from version 4.9.0. - - - You can get the name of the current model at runtime with `Prisma.getExtensionContext(this).$name`. You might use this to write out the model name to a log, to send the name to another service, or to branch your code based on the model. For example: diff --git a/content/200-orm/200-prisma-client/300-client-extensions/110-client.mdx b/content/200-orm/200-prisma-client/300-client-extensions/110-client.mdx index 5aad99108e..0955104a33 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/110-client.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/110-client.mdx @@ -5,18 +5,8 @@ metaDescription: 'Extend the functionality of Prisma Client, client component' toc_max_heading_level: 4 --- - - - - -Prisma Client extensions are Generally Available from versions 4.16.0 and later. They were introduced in Preview in version 4.7.0. Make sure you enable the `clientExtensions` Preview feature flag if you are running on a version earlier than 4.16.0. - - - You can use the `client` [Prisma Client extensions](/orm/prisma-client/client-extensions) component to add top-level methods to Prisma Client. - - ## Extend Prisma Client Use the `$extends` [client-level method](/orm/reference/prisma-client-reference#client-methods) to create an _extended client_. An extended client is a variant of the standard Prisma Client that is wrapped by one or more extensions. Use the `client` extension component to add top-level methods to Prisma Client. diff --git a/content/200-orm/200-prisma-client/300-client-extensions/120-query.mdx b/content/200-orm/200-prisma-client/300-client-extensions/120-query.mdx index 733c03041b..3e6c7b69a4 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/120-query.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/120-query.mdx @@ -5,20 +5,10 @@ metaDescription: 'Extend the functionality of Prisma Client, query component' toc_max_heading_level: 4 --- - - - - -Prisma Client extensions are Generally Available from versions 4.16.0 and later. They were introduced in Preview in version 4.7.0. Make sure you enable the `clientExtensions` Preview feature flag if you are running on a version earlier than 4.16.0. - - - You can use the `query` [Prisma Client extensions](/orm/prisma-client/client-extensions) component type to hook into the query life-cycle and modify an incoming query or its result. You can use Prisma Client extensions `query` component to create independent clients. This provides an alternative to [middlewares](/orm/prisma-client/client-extensions/middleware). You can bind one client to a specific filter or user, and another client to another filter or user. For example, you might do this to get [user isolation](/orm/prisma-client/client-extensions#extended-clients) in a row-level security (RLS) extension. In addition, unlike middlewares the `query` extension component gives you end-to-end type safety. [Learn more about `query` extensions versus middlewares](#query-extensions-versus-middlewares). - - ## Extend Prisma Client query operations Use the `$extends` [client-level method](/orm/reference/prisma-client-reference#client-methods) to create an [extended client](/orm/prisma-client/client-extensions#about-prisma-client-extensions). An extended client is a variant of the standard Prisma Client that is wrapped by one or more extensions. diff --git a/content/200-orm/200-prisma-client/300-client-extensions/130-result.mdx b/content/200-orm/200-prisma-client/300-client-extensions/130-result.mdx index a413790ec3..c0a5b98f51 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/130-result.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/130-result.mdx @@ -5,18 +5,8 @@ metaDescription: 'Extend the functionality of Prisma Client, result component' toc_max_heading_level: 4 --- - - - - -Prisma Client extensions are Generally Available from versions 4.16.0 and later. They were introduced in Preview in version 4.7.0. Make sure you enable the `clientExtensions` Preview feature flag if you are running on a version earlier than 4.16.0. - - - You can use the `result` [Prisma Client extensions](/orm/prisma-client/client-extensions) component type to add custom fields and methods to query results. - - Use the `$extends` [client-level method](/orm/reference/prisma-client-reference#client-methods) to create an _extended client_. An extended client is a variant of the standard Prisma Client that is wrapped by one or more extensions. To add a custom [field](#add-a-custom-field-to-query-results) or [method](#add-a-custom-method-to-the-result-object) to query results, use the following structure. In this example, we add the custom field `myComputedField` to the result of a `user` model query. diff --git a/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/index.mdx b/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/index.mdx index 35fd2675e1..a94a35e5a4 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/index.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/index.mdx @@ -4,17 +4,15 @@ metaTitle: 'Middleware (Reference)' metaDescription: 'Prisma Client middleware allows you to perform actions before or after any query on any model with the prisma.$use method.' --- - +:::warning Deprecation warning - - -**Deprecated**: Middleware is deprecated in version 4.16.0. +Middleware was deprecated in Prisma ORM version 4.16.0. -We recommend using the [Prisma Client extensions `query` component type](/orm/prisma-client/client-extensions/query) as an alternative to middleware. Prisma Client extensions were first introduced into Preview in version 4.7.0 and made Generally Available in 4.16.0. +We recommend using the [Prisma Client extensions `query` component type](/orm/prisma-client/client-extensions/query) as an alternative to middleware. Prisma Client extensions allow you to create independent Prisma Client instances and bind each client to a specific filter or user. For example, you could bind clients to specific users to provide user isolation. Prisma Client extensions also provide end-to-end type safety. - +::: Middlewares act as query-level lifecycle hooks, which allow you to perform an action before or after a query runs. Use the [`prisma.$use`](/orm/reference/prisma-client-reference#use) method to add middleware, as follows: @@ -61,8 +59,6 @@ Possible use cases for middleware include: There are many more use cases for middleware - this list serves as inspiration for the types of problems that middleware is designed to address. - - ## Samples The following sample scenarios show how to use middleware in practice: diff --git a/content/200-orm/200-prisma-client/300-client-extensions/index.mdx b/content/200-orm/200-prisma-client/300-client-extensions/index.mdx index cfcf31b5e2..bf90015336 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/index.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/index.mdx @@ -5,14 +5,6 @@ metaDescription: 'Extend the functionality of Prisma Client' toc_max_heading_level: 4 --- - - - - -Prisma Client extensions are Generally Available from versions 4.16.0 and later. They were introduced in Preview in version 4.7.0. Make sure you enable the `clientExtensions` Preview feature flag if you are running on a version earlier than 4.16.0. - - - You can use Prisma Client extensions to add functionality to your models, result objects, and queries, or to add client-level methods. You can create an extension with one or more of the following component types: @@ -24,8 +16,6 @@ You can create an extension with one or more of the following component types: For example, you might create an extension that uses the `model` and `client` component types. - - ## About Prisma Client extensions When you use a Prisma Client extension, you create an _extended client_. An extended client is a lightweight variant of the standard Prisma Client that is wrapped by one or more extensions. The standard client is not mutated. You can add as many extended clients as you want to your project. [Learn more about extended clients](#extended-clients). diff --git a/content/200-orm/200-prisma-client/400-type-safety/index.mdx b/content/200-orm/200-prisma-client/400-type-safety/index.mdx index caa214ec6e..9fa1ceacb1 100644 --- a/content/200-orm/200-prisma-client/400-type-safety/index.mdx +++ b/content/200-orm/200-prisma-client/400-type-safety/index.mdx @@ -233,12 +233,6 @@ We recommend using the "safe" `Input` types whenever possible. ## Type utilities - - -This feature is available from Prisma ORM version 4.9.0 upwards. - - - To help you create highly type-safe applications, Prisma Client provides a set of type utilities that tap into input and output types. These types are fully dynamic, which means that they adapt to any given model and schema. You can use them to improve the auto-completion and developer experience of your projects. This is especially useful in [validating inputs](/orm/prisma-client/type-safety/prisma-validator) and [shared Prisma Client extensions](/orm/prisma-client/client-extensions/shared-extensions). diff --git a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/600-legacy-migrate.mdx b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/600-legacy-migrate.mdx deleted file mode 100644 index 272a15e8ad..0000000000 --- a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/600-legacy-migrate.mdx +++ /dev/null @@ -1,466 +0,0 @@ ---- -title: 'Legacy Prisma Migrate' -metaTitle: 'Legacy Prisma Migrate (Reference)' -metaDescription: 'Legacy Prisma Migrate is a declarative data modeling and schema migration tool that is available via the Prisma CLI.' -tocDepth: 3 -unlisted: true ---- - - - -> **Important!** This page documents legacy Prisma Migrate (Experimental) available in version 2.12.0 and earlier. [Prisma Migrate](/orm/prisma-migrate) is available in version [2.13.0](https://github.com/prisma/prisma/releases/tag/2.13.0) and Generally Available in [2.19.0](https://github.com/prisma/prisma/releases/tag/2.19.0). - -Legacy Prisma Migrate is a tool that lets you _change your database schema_, e.g. by creating new tables or adding columns to existing tables. These changes are called _schema migrations_. legacy Prisma Migrate is available as part of the [Prisma CLI](/orm/tools/prisma-cli#installation) via the `legacy Prisma Migrate` command. - - - -## Documentation - -### Legacy Prisma Migrate vs the `db push` command - -If you want to prototype or iterate on a schema design in a development environment, consider the [`db push` command](/orm/reference/prisma-cli-reference#db-push). - -### Legacy Prisma Migrate vs SQL migrations - -Legacy Prisma Migrate is a _declarative_ migration system, as opposed to SQL which can be considered _imperative_: - -- **SQL (imperative)**: Provide the individual _steps_ to get from the current schema to the desired schema. -- **legacy Prisma Migrate (declarative)**: Define the desired schema as a [Prisma schema data model](/orm/prisma-schema/data-model/models) (legacy Prisma Migrate takes care of generating the necessary _steps_). - -Here's a quick comparison. Assume you have the following scenario: - -1. You need to create the `User` table to store user information (name, email, ...) -1. Create two new tables `Post` and `Profile` with foreign keys to `User` -1. Add a new column with a default value to the `Post` table - -#### SQL - -In SQL, you'd have to send three subsequent SQL statements to account for this scenario: - -##### 1. Create the `User` table to store user information (name, email, ...) - -```sql -CREATE TABLE "User" ( - id SERIAL PRIMARY KEY, - name VARCHAR(255), - email VARCHAR(255) NOT NULL -); -``` - -##### 2. Create two new tables `Post` and `Profile` with foreign keys to `User` - -```sql -CREATE TABLE "Profile" ( - id SERIAL PRIMARY KEY, - bio TEXT NOT NULL, - "user" integer NOT NULL UNIQUE, - FOREIGN KEY ("user") REFERENCES "User"(id) -); -CREATE TABLE "Post" ( - id SERIAL PRIMARY KEY, - title VARCHAR(255) NOT NULL, - author integer NOT NULL, - FOREIGN KEY (author) REFERENCES "User"(id) -); -``` - -##### 3. Add a new column with a default value to the `Post` table - -```sql -ALTER TABLE "Post" -ADD COLUMN published BOOLEAN DEFAULT false; -``` - -#### legacy Prisma Migrate - -With legacy Prisma Migrate, you write the desired database schema in the form of a [Prisma schema data model](/orm/prisma-schema/data-model/models) inside your [Prisma schema file](/orm/prisma-schema). To map the data model to your database schema, you then have to run these two commands: - -```terminal -prisma migrate save --experimental -prisma migrate up --experimental -``` - -The first command _saves_ a new migration to the `prisma/migrations` directory in the file system of your project and updates the `_Migration` table in your database. Each time you run this command to save a new migration, it creates a dedicated directory inside of `prisma/migrations` for that specific migration, which will have its own `README.md` file containing detailed information about the migration (e.g. the generated SQL statements which will be executed when you run `legacy Prisma Migrate up`). - -The second command _executes_ the migration against your database. - -##### 1. Create the `User` table to store user information (name, email, ...) - -Add the model to your Prisma schema: - -```prisma -model User { - id Int @id @default(autoincrement()) - name String? - email String @unique -} -``` - -Now run the two commands mentioned above: - -```terminal -prisma migrate save --experimental -prisma migrate up --experimental -``` - -##### 2. Create two new tables `Post` and `Profile` with foreign keys to `User` - -Add two models with [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) to your Prisma schema: - -```prisma -model User { - id Int @id @default(autoincrement()) - name String? - email String @unique - posts Post[] - profile Profile? -} - -model Profile { - id Int @id @default(autoincrement()) - bio String - user User @relation(fields: [userId], references: [id]) - userId Int -} - -model Post { - id Int @id @default(autoincrement()) - title String - author User @relation(fields: [authorId], references: [id]) - authorId Int -} -``` - -Notice that in addition to the [annotated relation fields](/orm/prisma-schema/data-model/relations#annotated-relation-fields) and its relation scalar field (which represent the foreign keys), you must also specify the Prisma-level [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) on the other side of the relation. - -Now run the two commands mentioned above: - -```terminal -prisma migrate save --experimental -prisma migrate up --experimental -``` - -##### 3. Add a new column with default value to the `Post` table - -Add a [field](/orm/prisma-schema/data-model/models#defining-fields) to the `Post` model: - -```prisma -model User { - id Int @id @default(autoincrement()) - name String? - email String @unique - posts Post[] - profile Profile? -} - -model Profile { - id Int @id @default(autoincrement()) - bio String - user User @relation(fields: [userId], references: [id]) - userId Int -} - -model Post { - id Int @id @default(autoincrement()) - title String - published Boolean @default(false) - authorId Int - author User @relation(fields: [authorId], references: [id]) -} -``` - -Now run the two commands mentioned above: - -```terminal -prisma migrate save --experimental -prisma migrate up --experimental -``` - -### Supported operations - -The following table shows which SQL operations are currently supported by legacy Prisma Migrate. - -| Operation | SQL | Supported | -| :-------------------------------- | :------------------------------ | :-----------------------------------------------------------------------------------: | -| Create a new table | `CREATE TABLE` | ✔️ | -| Rename an existing table | `ALTER TABLE` + `RENAME` | No | -| Delete an existing table | `DROP TABLE` | ✔️ | -| Add a column to an existing table | `ALTER TABLE` + `ADD COLUMN` | ✔️ | -| Rename an existing column | `ALTER TABLE` + `RENAME COLUMN` | No | -| Delete an existing column | `ALTER TABLE` + `DROP COLUMN` | ✔️ | -| Set primary keys (IDs) | `PRIMARY KEY` | ✔️ | -| Define relations (foreign keys) | `FOREIGN KEY` + `REFERENCES` | ✔️ | -| Make columns optional/required | `NOT NULL` | ✔️ | -| Set unique constraints | `UNIQUE` | ✔️ | -| Set default values | `DEFAULT` | ✔️ | -| Define enums | `ENUM` | ✔️ | -| Create indexes | `CREATE INDEX` | ✔️ | -| Cascading deletes | `ON DELETE` | No (workaround: manually add in SQL and introspect) | -| Cascading updates | `ON UPDATE` | No | -| Data validation | `CHECK` | No ([workaround](/orm/more/help-and-troubleshooting/check-constraints)) | - -Note that this table assumes that the operation is also supported by the underlying database. For example, `ENUM` is not supported in SQLite. This means that you also can't use `enum` when using legacy Prisma Migrate. - -### Migration history - -legacy Prisma Migrate stores the migration history of your project in two places: - -- A directory called `migrations` on your file system -- A table called `_Migration` in your database - -#### The `migrations` directory - -The `migrations` directory stores information about the migrations that have been or will be executed against your database. You should never make any manual changes to the files in `migrations`. The only way to change the content of this directory should be using the `legacy Prisma Migrate save` command. - -The `migrations` directory should be checked into version control (e.g. Git). - -#### The `_Migration` table - -The `_Migration` table additionally stores information about each migration that was ever executed against the database by legacy Prisma Migrate. - -### Typical workflow - -With **legacy Prisma Migrate**, the workflow looks slightly different: - -1. Manually adjust your [Prisma schema data model](/orm/prisma-schema/data-model/models) -1. Migrate your database using the `legacy Prisma Migrate` CLI commands -1. (Re-)generate Prisma Client -1. Use Prisma Client in your application code to access your database - -### Troubleshooting - -Since legacy Prisma Migrate is currently Experimental, you might end up in a state where the `migrations` directory and/or the `_Migrations` table are out of sync with the actual state of the database. In these cases, it often helps to "reset" legacy Prisma Migrate by deleting the `migrations` folder and deleting all entries from the `_Migration` table. - -#### Delete the `migrations` directory - -```terminal -rm -rf migrations -``` - -#### Delete all entries from the `_Migration` table - -```sql -TRUNCATE _Migration; -``` - -## CLI Reference - -> Warning: The `migrate` command is still considered Experimental. As such, there are no guarantees about API stability or production-readiness. Access to this command is provided for evaluation and experimentation. To access Experimental commands, you must add the `--experimental` flag. - -The `migrate` command creates and manages database migrations. It can be used to create, apply, and rollback database schema updates in a controlled manner. - -The `migrate` command includes a number of subcommands to specify the desired action. - -### `migrate save` - -Saves a migration that defines the steps necessary to update your current schema. - -#### Prerequisites - -Before using the `migrate save` command, you must define a valid [`datasource`](/orm/prisma-schema/overview/data-sources) within your `schema.prisma` file. - -For example, the following `datasource` defines a SQLite database file within the current directory: - -```prisma -datasource db { - provider = "sqlite" - url = "file:my-database.db" -} -``` - -#### Options - -The `migrate save` command recognizes the following options to modify its behavior: - -| Option | Required | Description | Default | -| ------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------- | -| `--experimental` | Yes | Enables use of Experimental commands. | | -| `-n`, `--name` | No | The name of the migration. If not provided, `migrate save` will prompt you for a name. | Timestamp `20200618145356` | -| `-c`, `--create-db` | No | Create the database if it does not exist. | | -| `-p`, `--preview` | No | Preview the migration that would be created without writing any changes to the filesystem. | | -| `--schema` | No | Specifies the path to the desired `schema.prisma` file to be processed instead of the default path. Both absolute and relative paths are supported. | `./schema.prisma`, `./prisma/schema.prisma` | - -#### Generated Assets - -The `migrate save` command generates the following directories and files as necessary: - -- `migrations`: A directory within the current project to store migrations. This directory will be created if it does not exist. -- `migrations/migrate.lock`: A lock file created specifying the current migration applied to the database. This file will be created if it does not exist. -- `migrations/`: A directory for a specific migration. The migration name is derived from the timestamp when it was created followed by a hyphen and the migration name provided by the user. -- `migrations//README.md`: A human-readable description of the migration including metadata like when the migration was created and by who, a list of the actual migration changes and a diff of the changes that are made to the `schema.prisma` file. -- `migrations//schema.prisma`: The schema that will be created if the migration is applied to the project. -- `migrations//steps.json`: An [alternative representation](https://github.com/prisma/specs/tree/master/migrate#step) of the migration steps that will be applied. - -#### Examples - -##### Create a new migration - -```terminal -prisma migrate save --experimental -``` - -The command will prompt you for a name for the migration since one was not provided on the command line. After creating the migration, the contents of the generated `schema.prisma` file are displayed. - -##### Create a migration with a specific name - -```terminal -prisma migrate save --name "First migration" --experimental -``` - -##### Create the database if it does not already exist - -```terminal -prisma migrate save --create-db --experimental -``` - -##### Preview the migration that would be created by running the `migrate save` command - -```terminal -prisma migrate save --preview --experimental -``` - -### `migrate up` - -Migrate the database up to a specific state. - -#### Prerequisites - -Before using the `migrate up` command, you must define a valid [`datasource`](/orm/prisma-schema/overview/data-sources) within your `schema.prisma` file. - -For example, the following `datasource` defines a SQLite database file within the current directory: - -```prisma -datasource db { - provider = "sqlite" - url = "file:my-database.db" -} -``` - -#### Arguments - -The point to migrate the database up to can be defined in any of the following three ways: - -| Argument | Required | Description | Default | -| --------- | -------- | ---------------------------------------------------------------------------------- | ------- | -| increment | No | Specifies the number of forward migrations to apply. | latest | -| name | No | Specifies where to migrate to using the name of the final migration to apply. | latest | -| timestamp | No | Specifies where to migrate to using the timestamp of the final migration to apply. | latest | - -#### Options - -Additionally, the following options modify the behavior of the `migrate up` command: - -| Option | Required | Description | Default | -| ------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------- | -| `--experimental` | Yes | Enables use of Experimental commands | | -| `-c`, `--create-db` | No | Create the database if it does not exist. | | -| `-p`, `--preview` | No | Preview the migration that would be created without writing any changes to the filesystem. | | -| `--schema` | No | Specifies the path to the desired `schema.prisma` file to be processed instead of the default path. Both absolute and relative paths are supported. | `./schema.prisma`, `./prisma/schema.prisma` | -| `--auto-approve` | No | Skip interactive approval before migrating. | | - -#### Examples - -##### Migrate the database up to the latest available migration - -```terminal -prisma migrate up --experimental -``` - -##### Apply the next two migrations to the database - -```terminal -prisma migrate up 2 --experimental -``` - -##### Apply all migrations necessary up to and including a migration by name - -```terminal -prisma migrate up "First migration" --experimental -``` - -##### Apply all migrations necessary up to and including a migration by timestamp - -```terminal -prisma migrate up 20200223181448 --experimental -``` - -##### Create the database if it does not already exist before applying the migrations - -```terminal -prisma migrate up --create-db --experimental -``` - -##### Preview the migration that would be applied by running the `migrate up` command - -```terminal -prisma migrate up --preview --experimental -``` - -### `migrate down` - -Migrate the database down to a specific state. - -#### Prerequisites - -Before using the `migrate down` command, you must define a valid [`datasource`](/orm/prisma-schema/overview/data-sources) within your `schema.prisma` file. - -For example, the following `datasource` defines a SQLite database file within the current directory: - -```prisma -datasource db { - provider = "sqlite" - url = "file:my-database.db" -} -``` - -#### Arguments - -The point to migrate back to can be defined in any of the following three ways: - -| Argument | Required | Description | Default | -| --------- | -------- | --------------------------------------------------------------------------------------- | ------- | -| decrement | No | Specifies the number of backwards migrations to apply. | 1 | -| name | No | Specifies where to migrate back to using the name of the final migration to apply. | -| timestamp | No | Specifies where to migrate back to using the timestamp of the final migration to apply. | - -#### Options - -Additionally, the following options modify the behavior of the `migrate down` command: - -| Option | Required | Description | Default | -| ----------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------- | -| `--experimental` | Yes | Enables use of Experimental commands | | -| `-p`, `--preview` | No | Preview the migration that would be created without writing any changes to the filesystem. | | -| `--schema` | No | Specifies the path to the desired `schema.prisma` file to be processed instead of the default path. Both absolute and relative paths are supported. | `./schema.prisma`, `./prisma/schema.prisma` | - -#### Examples - -##### Migrate the database backwards by a single migration - -```terminal -prisma migrate down --experimental -``` - -##### Migrate the database backwards by two migrations - -```terminal -prisma migrate down 2 --experimental -``` - -##### Migrate backwards through all migrations up to and including a migration by name - -```terminal -prisma migrate down "First migration" --experimental -``` - -##### Migrate backwards through all migrations up to and including a migration by timestamp - -```terminal -prisma migrate down 20200223181448 --experimental -``` - -##### Preview the migration that would be applied by running the `migrate down` command - -```terminal -prisma migrate down --preview --experimental -``` diff --git a/content/200-orm/300-prisma-migrate/300-workflows/10-seeding.mdx b/content/200-orm/300-prisma-migrate/300-workflows/10-seeding.mdx index 55092c5559..d352045f51 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/10-seeding.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/10-seeding.mdx @@ -385,8 +385,6 @@ psql file.sql ### User-defined arguments -> This feature is available from version 4.15.0 and later. - `prisma db seed` allows you to define custom arguments in your seed file that you can pass to the `prisma db seed` command. For example, you could define your own arguments to seed different data for different environments or partially seeding data in some tables. Here is an example seed file that defines a custom argument to seed different data in different environments: diff --git a/content/200-orm/300-prisma-migrate/300-workflows/120-native-database-functions.mdx b/content/200-orm/300-prisma-migrate/300-workflows/120-native-database-functions.mdx index f9a6f18728..98ae838786 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/120-native-database-functions.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/120-native-database-functions.mdx @@ -4,44 +4,23 @@ metaTitle: Native database functions metaDescription: How to enable PostgreSQL native database functions for projects that use Prisma Migrate. --- - - In PostgreSQL, some [native database functions](/orm/prisma-schema/data-model/unsupported-database-features#native-database-functions) are part of optional extensions. For example, in PostgreSQL versions 12.13 and earlier the `gen_random_uuid()` function is part of the [`pgcrypto`](https://www.postgresql.org/docs/10/pgcrypto.html) extension. To use a PostgreSQL extension, you must install it on the file system of your database server and then activate the extension. If you use Prisma Migrate, this must be done as part of a migration. - +:::warning Do not activate extensions outside a migration file if you use Prisma Migrate. The [shadow database](/orm/prisma-migrate/understanding-prisma-migrate/shadow-database) requires the same extensions. Prisma Migrate creates and deletes the shadow database automatically, so the only way to activate an extension is to include it in a migration file. - - -In Prisma ORM versions 4.5.0 and later, you can activate the extension by declaring it in your Prisma schema with the [`postgresqlExtensions` preview feature](/orm/prisma-schema/postgresql-extensions): - -```prisma file=schema.prisma highlight=3,9;add showLineNumbers -generator client { - provider = "prisma-client-js" - //add-next-line - previewFeatures = ["postgresqlExtensions"] -} +::: -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") - //add-next-line - extensions = [pgcrypto] -} -``` +You can activate the extension by adding a SQL command to your migration file. See [How to install a PostgreSQL extension as part of a migration](#how-to-install-a-postgresql-extension-as-part-of-a-migration). You can then apply these changes to your database with Prisma Migrate. See [How to migrate PostgreSQL extensions](/orm/prisma-schema/postgresql-extensions#how-to-migrate-postgresql-extensions) for details. -In earlier versions of Prisma ORM, you must instead add a SQL command to your migration file to activate the extension. See [How to install a PostgreSQL extension as part of a migration](#how-to-install-a-postgresql-extension-as-part-of-a-migration). - - - ## How to install a PostgreSQL extension as part of a migration -This section describes how to add a SQL command to a migration file to activate a PostgreSQL extension. If you manage PostgreSQL extensions in your Prisma Schema with the `postgresqlExtensions` preview feature instead, see [How to migrate PostgreSQL extensions](/orm/prisma-schema/postgresql-extensions#how-to-migrate-postgresql-extensions). +This section describes how to add a SQL command to a migration file to activate a PostgreSQL extension. The following example demonstrates how to install the `pgcrypto` extension as part of a migration: diff --git a/content/200-orm/400-tools/05-prisma-cli.mdx b/content/200-orm/400-tools/05-prisma-cli.mdx index f1af30fe00..5991be70ec 100644 --- a/content/200-orm/400-tools/05-prisma-cli.mdx +++ b/content/200-orm/400-tools/05-prisma-cli.mdx @@ -193,7 +193,7 @@ All `prisma` CLI commands return the following codes when they exit: - exit code 0 when a command runs successfully - exit code 1 when a command errors -- exit code 130 when the CLI receives a signal interrupt (SIGINT) message or if the user cancels a prompt. This exit code is available in Prisma ORM versions 4.3.0 and later. +- exit code 130 when the CLI receives a signal interrupt (SIGINT) message or if the user cancels a prompt. ## Telemetry diff --git a/content/200-orm/500-reference/050-prisma-client-reference.mdx b/content/200-orm/500-reference/050-prisma-client-reference.mdx index 9cf991b9e2..494a6c1ec8 100644 --- a/content/200-orm/500-reference/050-prisma-client-reference.mdx +++ b/content/200-orm/500-reference/050-prisma-client-reference.mdx @@ -407,66 +407,6 @@ const adapter = new PrismaNeon(pool); const prisma = new PrismaClient({ adapter }); ``` -### `rejectOnNotFound` - - - -**Note**: `rejectOnNotFound` was removed in v5.0.0. - -**Deprecated:** `rejectOnNotFound` is deprecated in v4.0.0. From v4.0.0, use the queries [`findUniqueOrThrow`](#finduniqueorthrow) or [`findFirstOrThrow`](#findfirstorthrow). - - - -Use the `rejectOnNotFound` parameter to configure `findUnique()` and/or `findFirst` to throw an error if the record was not found. By default, both operations return `null` if the record is not found. - -#### Remarks - -- You can configure `rejectOnNotFound` on a per-request level for both [`findUnique()`](#findunique) and [`findFirst`](#findfirst) - -#### Options - -| Option | Description | -| -------------------- | ------------------------------------------------------------------------------------------- | -| `RejectOnNotFound` | Enable globally (`true` / `false`) _or_ throw a custom error. | -| `RejectPerOperation` | Enable per operation (`true` / `false`) _or_ throw a custom error per operation, per model. | - -#### Examples - -##### Enable globally for `findUnique()` and `findFirst` - -```ts -const prisma = new PrismaClient({ - rejectOnNotFound: true, -}); -``` - -##### Enable globally for a specific operation - -```ts -const prisma = new PrismaClient({ - rejectOnNotFound: { - findUnique: true, - }, -}); -``` - -##### Throw a custom error per model and operation if record is not found - -```ts -const prisma = new PrismaClient({ - rejectOnNotFound: { - findFirst: { - User: (err) => new Error('User error'), - Post: (err) => new Error('Post error!'), - }, - findUnique: { - User: (err) => new Error('User error'), - Post: (err) => new Error('Post error!'), - }, - }, -}); -``` - ### `transactionOptions` @@ -527,7 +467,7 @@ Use model queries to perform CRUD operations on your models. See also: [CRUD](/o | Name | Example type (`User`) | Required | Description | | ------------------------------- | ------------------------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `where` | `UserWhereUniqueInput` | **Yes** | Wraps all fields of a model so that a record can be selected ([learn more](#filter-on-non-unique-fields-with-userwhereuniqueinput)).

Before version 4.5.0, this type only wraps _unique_ fields of a model. | +| `where` | `UserWhereUniqueInput` | **Yes** | Wraps all fields of a model so that a record can be selected ([learn more](#filter-on-non-unique-fields-with-userwhereuniqueinput)). | | `select` | `XOR` | No | [Specifies which properties to include](/orm/prisma-client/queries/select-fields) on the returned object. | | `include` | `XOR` | No | [Specifies which relations should be eagerly loaded](/orm/prisma-client/queries/relation-queries) on the returned object. | | `omit` | `XOR` | No | Specifies which properties to exclude on the returned object. In [Preview](/orm/more/releases#preview) since 5.13.0 | @@ -899,7 +839,7 @@ prisma:query COMMIT | Name | Type | Required | Description | | ----------------------- | ------------------------------------------------------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `data` | `XOR`UserUncheckedUpdateInput>` | **Yes** | Wraps all the fields of the model so that they can be provided when updating an existing record. Fields that are marked as optional or have default values in the datamodel are optional. | -| `where` | `UserWhereUniqueInput` | **Yes** | Wraps all fields of a model so that a record can be selected ([learn more](#filter-on-non-unique-fields-with-userwhereuniqueinput)).

Before version 4.5.0, this type only wraps _unique_ fields of a model. | +| `where` | `UserWhereUniqueInput` | **Yes** | Wraps all fields of a model so that a record can be selected ([learn more](#filter-on-non-unique-fields-with-userwhereuniqueinput)). | | [`select`](#select) | `XOR` | No | [Specifies which properties to include](/orm/prisma-client/queries/select-fields) on the returned object. | | [`include`](#include) | `XOR` | No | [Specifies which relations should be eagerly loaded](/orm/prisma-client/queries/relation-queries) on the returned object. | | [`omit`](#omit) | `XOR` | No | Specifies which properties to exclude on the returned object. In [Preview](/orm/more/releases#preview) since 5.13.0. | @@ -948,7 +888,7 @@ This section covers the usage of the `upsert()` operation. To learn about using | ----------------------- | ------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `create` | `XOR`UserUncheckedCreateInput>` | **Yes** | Wraps all the fields of the model so that they can be provided when creating new records. It also includes relation fields which lets you perform (transactional) nested inserts. Fields that are marked as optional or have default values in the datamodel are optional. | | `update` | `XOR`UserUncheckedUpdateInput>` | **Yes** | Wraps all the fields of the model so that they can be provided when updating an existing record. Fields that are marked as optional or have default values in the datamodel are optional. | -| `where` | `UserWhereUniqueInput` | **Yes** | Wraps all fields of a model so that a record can be selected ([learn more](#filter-on-non-unique-fields-with-userwhereuniqueinput)).

Before version 4.5.0, this type only wraps _unique_ fields of a model. | +| `where` | `UserWhereUniqueInput` | **Yes** | Wraps all fields of a model so that a record can be selected ([learn more](#filter-on-non-unique-fields-with-userwhereuniqueinput)). | | [`select`](#select) | `XOR` | No | [Specifies which properties to include](/orm/prisma-client/queries/select-fields) on the returned object. | | [`include`](#include) | `XOR` | No | [Specifies which relations should be eagerly loaded](/orm/prisma-client/queries/relation-queries) on the returned object. | | [`omit`](#omit) | `XOR` | No | Specifies which properties to exclude on the returned object. In [Preview](/orm/more/releases#preview) since 5.13.0 | @@ -965,7 +905,7 @@ This section covers the usage of the `upsert()` operation. To learn about using - To perform arithmetic operations on update (add, subtract, multiply, divide), use [atomic updates](#atomic-number-operations) to prevent race conditions. - If two or more upsert operations happen at the same time and the record doesn't already exist, then a race condition might happen. As a result, one or more of the upsert operations might throw a unique key constraint error. Your application code can catch this error and retry the operation. [Learn more](#unique-key-constraint-errors-on-upserts). -- From version 4.6.0, Prisma ORM hands over upsert queries to the database where possible. [Learn more](#database-upserts). +- Prisma ORM hands over upsert queries to the database where possible. [Learn more](#database-upserts). #### Examples @@ -1002,24 +942,13 @@ Handle the P2002 error in your application code. When it occurs, retry the upser Where possible, Prisma Client hands over an `upsert` query to the database. This is called a _database upsert_. +Prisma Client can use database upserts if your application uses a CockroachDB, PostgreSQL, or SQLite data source. + Database upserts have the following advantages: - They are faster than upserts handled by Prisma Client - [Unique key constraint errors](#unique-key-constraint-errors-on-upserts) cannot happen -Prisma Client uses a database upsert automatically when [specific criteria](#database-upsert-query-criteria) are met. When these criteria are not met, Prisma Client handles the `upsert`. - -To use a database upsert, Prisma Client sends the SQL construction [`INSERT ... ON CONFLICT SET .. WHERE`](https://www.prisma.io/dataguide/postgresql/inserting-and-modifying-data/insert-on-conflict) to the database. - -##### Database upsert prerequisites - -Prisma Client can use database upserts if your stack meets the following criteria: - -- You use Prisma ORM version 4.6.0 or later -- Your application uses a CockroachDB, PostgreSQL, or SQLite data source - -##### Database upsert query criteria - Prisma Client uses a database upsert for an `upsert` query when the query meets the following criteria: - There are no nested queries in the `upsert`'s `create` and `update` [options](#options-7) @@ -1030,6 +959,8 @@ Prisma Client uses a database upsert for an `upsert` query when the query meets If your query does not meet these criteria, then Prisma Client handles the upsert itself. +To use a database upsert, Prisma Client sends the SQL construction [`INSERT ... ON CONFLICT SET .. WHERE`](https://www.prisma.io/dataguide/postgresql/inserting-and-modifying-data/insert-on-conflict) to the database. + ##### Database upsert examples The following examples use this schema: @@ -1154,7 +1085,7 @@ To delete records that match a certain criteria, use [`deleteMany`](#deletemany) | Name | Type | Required | Description | | ----------------------- | ------------------------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `where` | `UserWhereUniqueInput` | **Yes** | Wraps all fields of a model so that a record can be selected ([learn more](#filter-on-non-unique-fields-with-userwhereuniqueinput)).

Before version 4.5.0, this type only wraps _unique_ fields of a model. | +| `where` | `UserWhereUniqueInput` | **Yes** | Wraps all fields of a model so that a record can be selected ([learn more](#filter-on-non-unique-fields-with-userwhereuniqueinput)). | | [`select`](#select) | `XOR` | No | [Specifies which properties to include](/orm/prisma-client/queries/select-fields) on the returned object. | | [`include`](#include) | `XOR` | No | [Specifies which relations should be eagerly loaded](/orm/prisma-client/queries/relation-queries) on the returned object. | | [`omit`](#omit) | `XOR` | No | Specifies which properties to exclude on the returned object. In [Preview](/orm/more/releases#preview) since 5.13.0 | @@ -2236,10 +2167,11 @@ The following examples demonstrate how to use the [`validator`](/orm/prisma-clie }); ``` -- `UserWhereUniqueInput` This type works by exposing any unique fields on the model. A field assigned `@id` is considered unique, - as is one assigned `@unique`. +- `UserWhereUniqueInput` - From version 4.5.0, this type exposes all fields on the model. This means that when you filter for a single record based on a unique field, you can check additional non-unique and unique fields at the same time. [Learn more](#filter-on-non-unique-fields-with-userwhereuniqueinput). + A field assigned `@id` is considered unique, as is one assigned `@unique`. + + This type exposes all fields on the model. This means that when you filter for a single record based on a unique field, you can check additional non-unique and unique fields at the same time. [Learn more](#filter-on-non-unique-fields-with-userwhereuniqueinput). ```ts // UserWhereUniqueInput @@ -2256,8 +2188,9 @@ The following examples demonstrate how to use the [`validator`](/orm/prisma-clie }); ``` -- `PostUpdateWithWhereUniqueWithoutAuthorInput` - This type accepts a unique `where` field (an `@id` or another assigned `@unique`) - and updates any field on the `Post` model except the `Author`. The `Author` is the scalar field on the `Post` model. +- `PostUpdateWithWhereUniqueWithoutAuthorInput` + + This type accepts a unique `where` field (an `@id` or another assigned `@unique`) and updates any field on the `Post` model except the `Author`. The `Author` is the scalar field on the `Post` model. ```ts const updatePostByIdWithoutAuthor = @@ -2331,7 +2264,7 @@ Note: - This argument is optional. - It is for use on optional [scalar](/orm/prisma-schema/data-model/models#scalar-fields) fields only. If you try to sort by nulls on a required or [relation](/orm/prisma-schema/data-model/models#relation-fields) field, Prisma Client throws a [P2009 error](/orm/reference/error-reference#p2009). -- It is available in version 4.1.0 and later, as a preview feature. See [sort with nulls first or last](/orm/prisma-client/queries/filtering-and-sorting#sort-with-null-records-first-or-last) for details of how to enable the feature. +- It is available as a preview feature. See [sort with nulls first or last](/orm/prisma-client/queries/filtering-and-sorting#sort-with-null-records-first-or-last) for details of how to enable the feature. | Name | Description | | ------- | ------------------------------ | @@ -3606,13 +3539,6 @@ const result = await prisma.user.update({ ## Filter conditions and operators - - -- From version 4.3.0, you can also use these operators to compare _fields_ in the same model [with the `.fields` property](#compare-columns-in-the-same-table). -- In versions before 4.3.0, you can compare fields in the same model [with raw queries](/orm/more/help-and-troubleshooting/comparing-columns-through-raw-queries). - - - ### `equals` Value equals `n`. @@ -3643,8 +3569,6 @@ const result = await prisma.user.findMany({ ##### Return all products with a quantity lower than the "warn quantity" threshold -This example compares fields of the same model which is available as of version 4.3.0. - ```ts const productsWithLowQuantity = await prisma.product.findMany({ where: { @@ -5667,19 +5591,6 @@ const validateUserAndPostInput = (name, email, postTitle) => { You can compare columns in the same table directly, for non-unique filters. -This feature was moved to general availability in version 5.0.0 and was available via the `fieldReference` Preview feature from Prisma ORM versions 4.3.0 to 4.16.2. - - - -In the following situations, you must [use raw queries to compare columns in the same table](/orm/more/help-and-troubleshooting/comparing-columns-through-raw-queries): - -- If you use a version earlier than 4.3.0 -- If you want to use a unique filter, such as [`findUnique`](#findunique) or [`findUniqueOrThrow`](#finduniqueorthrow) -- If you want to compare a field with a [unique constraint](/orm/prisma-schema/data-model/models#defining-a-unique-field) -- If you want to use one of the following operators to compare a [JSON field](/orm/prisma-client/special-fields-and-types/working-with-json-fields) in MySQL or MariaDB with another field: [`gt`](#gt), [`gte`](#gte), [`lt`](#lt), or [`lte`](#lte). Note that you can use these operators to compare the JSON field with a scalar value. This limitation applies only if you try to compare a JSON field with another field. - - - To compare columns in the same table, use the `.fields` property. In the following example, the query returns all records where the value in the `prisma.product.quantity` field is less than or equal to the value in the `prisma.product.warnQuantity` field. ```ts @@ -5766,7 +5677,6 @@ await prisma.user.findMany({ ## Filter on non-unique fields with `UserWhereUniqueInput` From version 5.0.0, the generated type `UserWhereUniqueInput` on [`where`](#where) exposes all fields on the model, not just unique fields. -This was available under the [`extendedWhereUnique` Preview flag](/orm/reference/preview-features/client-preview-features#preview-features-promoted-to-general-availability) between versions 4.5.0 to 4.16.2 You must specify at least one unique field in your `where` statement [outside of boolean operators](#boolean-operators-with-userwhereuniqueinput), and you can specify any number of additional unique and non-unique fields. You can use this to add filters to any operation that returns a single record. For example, you can use this feature for the following: @@ -5774,13 +5684,11 @@ You must specify at least one unique field in your `where` statement [outside of - [Permission checks](#permission-checks) - [Soft deletes](#soft-deletes) -From version 4.6.0, you can use this feature to filter on optional [one-to-one nested reads](/orm/prisma-client/queries/relation-queries#nested-reads). - ### Optimistic concurrency control on updates You can filter on non-unique fields to perform [optimistic concurrency control](/orm/prisma-client/queries/transactions#optimistic-concurrency-control) on `update` operations. -To perform optimistic concurrency control, we recommend that you use a `version` field to check whether the data in a record or related record has changed while your code executes. Before version 4.5.0, you could not evaluate the `version` field in an `update` operation, because the field is non-unique. From version 4.5.0, you can evaluate the `version` field. +To perform optimistic concurrency control, we recommend that you use a `version` field to check whether the data in a record or related record has changed while your code executes. In the following example, `updateOne` and `updateTwo` first read the same record and then attempt to update it. The database only executes these updates if the value in `version` is the same as the value when it did the initial read. When the database executes the first of these updates (which might be `updateOne` or `updateTwo`, depending on timing), it increments the value in `version`. This means that the database does not execute the second update because the value in `version` has changed. @@ -5871,13 +5779,6 @@ await prisma.user.update({ #### One-to-one relations -From version 4.5.0, you can filter on non-unique fields in the following operations on [one-to-one relations](/orm/prisma-schema/data-model/relations/one-to-one-relations): - -- Nested update -- Nested upsert -- Nested disconnect -- Nested delete - Prisma Client automatically uses a unique filter to select the appropriate related record. As a result, you do not need to specify a unique filter in your `where` statement with a `WhereUniqueInput` [generated type](#generated-types-for-where). Instead, the `where` statement has a `WhereInput` generated type. You can use this to filter without the restrictions of `WhereUniqueInput`. ##### Nested update example @@ -5887,9 +5788,6 @@ await prisma.user.update({ where: { id: 1, }, data: { to_one: { - // Before Prisma version 4.5.0 - update: { field: "updated" } - // From Prisma version 4.5.0, you can also do the following: update: { where: { /*WhereInput*/ }, data: { field: "updated" } } } } } @@ -5920,9 +5818,6 @@ await prisma.user.update({ where: { id: 1, }, data: { to_one: { - // Before Prisma version 4.5.0 - disconnect: true - // From Prisma version 4.5.0, you can also do the following: disconnect: { /* WhereInput */ } } } @@ -5936,9 +5831,6 @@ await prisma.user.update({ where: { id: 1, }, data: { to_one: { - // Before Prisma version 4.5.0 - delete: true - // From Prisma version 4.5.0, you can also do the following: delete: { /* WhereInput */ } } } diff --git a/content/200-orm/500-reference/100-prisma-schema-reference.mdx b/content/200-orm/500-reference/100-prisma-schema-reference.mdx index 24c7ccd499..c9f0a6a7e8 100644 --- a/content/200-orm/500-reference/100-prisma-schema-reference.mdx +++ b/content/200-orm/500-reference/100-prisma-schema-reference.mdx @@ -20,9 +20,9 @@ A `datasource` block accepts the following fields: | `provider` | **Yes** | String (`postgresql`, `mysql`, `sqlite`, `sqlserver`, `mongodb`, `cockroachdb`) | Describes which data source connectors to use. | | `url` | **Yes** | String (URL) | Connection URL including authentication info. Most connectors use [the syntax provided by the database](/orm/reference/connection-urls#format). | | `shadowDatabaseUrl` | No | String (URL) | Connection URL to the shadow database used by Prisma Migrate. Allows you to use a cloud-hosted database as the shadow database. | -| `directUrl` | No | String (URL) | Connection URL for direct connection to the database.

If you use a connection pooler URL in the `url` argument (for example, if you use [Prisma Accelerate](/accelerate) or pgBouncer), Prisma CLI commands that require a direct connection to the database use the URL in the `directUrl` argument.

The `directUrl` property is supported by Prisma Studio from version 5.1.0 upwards.

The `directUrl` property is not needed when using [Prisma Postgres](/postgres) database. | -| `relationMode` | No | String (`foreignKeys`, `prisma`) | Sets whether [referential integrity](/orm/prisma-schema/data-model/relations/relation-mode) is enforced by foreign keys in the database or emulated in the Prisma Client.

In preview in versions 3.1.1 and later. The field is named `relationMode` in versions 4.5.0 and later, and was previously named `referentialIntegrity`. | -| `extensions` | No | List of strings (PostgreSQL extension names) | Allows you to [represent PostgreSQL extensions in your schema](/orm/prisma-schema/postgresql-extensions#how-to-represent-postgresql-extensions-in-your-prisma-schema). Available in preview for PostgreSQL only in Prisma ORM versions 4.5.0 and later. | +| `directUrl` | No | String (URL) | Connection URL for direct connection to the database.

If you use a connection pooler URL in the `url` argument (for example, if you use [Prisma Accelerate](/accelerate) or pgBouncer), Prisma CLI commands that require a direct connection to the database use the URL in the `directUrl` argument.

The `directUrl` property is supported by Prisma Studio from Prisma ORM version 5.1.0 upwards.

The `directUrl` property is not needed when using [Prisma Postgres](/postgres) database. | +| `relationMode` | No | String (`foreignKeys`, `prisma`) | Sets whether [referential integrity](/orm/prisma-schema/data-model/relations/relation-mode) is enforced by foreign keys in the database or emulated in the Prisma Client. | +| `extensions` | No | List of strings (PostgreSQL extension names) | Allows you to [represent PostgreSQL extensions in your schema](/orm/prisma-schema/postgresql-extensions#how-to-represent-postgresql-extensions-in-your-prisma-schema). | The following providers are available: @@ -194,19 +194,15 @@ Unless specified otherwise, the default supported CPU architecture is x86_64. | Build OS | Prisma engine build name | OpenSSL | | :---------------------- | :--------------------------- | :-----: | -| Alpine (3.17 and newer) | `linux-musl-openssl-3.0.x`\* | 3.0.x | +| Alpine (3.17 and newer) | `linux-musl-openssl-3.0.x` | 3.0.x | | Alpine (3.16 and older) | `linux-musl` | 1.1.x | -\* Available in Prisma ORM versions 4.8.0 and later. - ##### Linux (Alpine on ARM64 architectures) | Build OS | Prisma engine build name | OpenSSL | | :---------------------- | :--------------------------------- | :-----: | -| Alpine (3.17 and newer) | `linux-musl-arm64-openssl-3.0.x`\* | 3.0.x | -| Alpine (3.16 and older) | `linux-musl-arm64-openssl-1.1.x`\* | 1.1.x | - -\* Available in Prisma ORM versions 4.10.0 and later. +| Alpine (3.17 and newer) | `linux-musl-arm64-openssl-3.0.x` | 3.0.x | +| Alpine (3.16 and older) | `linux-musl-arm64-openssl-1.1.x` | 1.1.x | ##### Linux (Debian), x86_64 @@ -349,7 +345,7 @@ Defines a Prisma [model](/orm/prisma-schema/data-model/models#defining-models) . #### Order of fields -- In version 2.3.0 and later, introspection lists model fields in the same order as the corresponding columns in the database. Relation fields are listed after scalar fields. +Introspection lists model fields in the same order as the corresponding columns in the database. Relation fields are listed after scalar fields. ### Examples @@ -684,8 +680,6 @@ True or false value. Floating point number. -> `Float` maps to `Double` in [2.17.0](https://github.com/prisma/prisma/releases/tag/2.17.0) and later - see [release notes](https://github.com/prisma/prisma/releases/tag/2.17.0) and [Video: Changes to the default mapping of Float in Prisma ORM 2.17.0](https://www.youtube.com/watch?v=OsuGP_xNHco&%3Bab_channel=Prisma) for more information about this change. - #### Default type mappings | Connector | Default mapping | @@ -1089,8 +1083,6 @@ model User { ##### Define a scalar list with a default value -Available in version 4.0.0 and later. - @@ -1198,10 +1190,10 @@ Defines a single-field ID on the model. | Name | Required | Type | Description | | ----------- | -------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `map` | **No** | `String` | The name of the underlying primary key constraint in the database.

Not supported for MySQL or MongoDB. | -| `length` | **No** | `number` | Allows you to specify a maximum length for the subpart of the value to be indexed.

MySQL only. In preview in versions 3.5.0 and later, and in general availability in versions 4.0.0 and later. | -| `sort` | **No** | `String` | Allows you to specify in what order the entries of the ID are stored in the database. The available options are `Asc` and `Desc`.

SQL Server only. In preview in versions 3.5.0 and later, and in general availability in versions 4.0.0 and later. | -| `clustered` | **No** | `Boolean` | Defines whether the ID is clustered or non-clustered. Defaults to `true`.

SQL Server only. In preview in versions 3.13.0 and later, and in general availability in versions 4.0.0 and later. | +| `map` | **No** | `String` | The name of the underlying primary key constraint in the database. Not supported for MySQL or MongoDB. | +| `length` | **No** | `number` | Allows you to specify a maximum length for the subpart of the value to be indexed. MySQL only. | +| `sort` | **No** | `String` | Allows you to specify in what order the entries of the ID are stored in the database. The available options are `Asc` and `Desc`. SQL Server only. | +| `clustered` | **No** | `Boolean` | Defines whether the ID is clustered or non-clustered. Defaults to `true`. SQL Server only. | #### Signature @@ -1209,18 +1201,6 @@ Defines a single-field ID on the model. @id(map: String?, length: number?, sort: String?, clustered: Boolean?) ``` -> **Note**: Before version 4.0.0, or 3.5.0 with the `extendedIndexes` Preview feature enabled, the signature was: -> -> ```prisma no-lines -> @id(map: String?) -> ``` - -> **Note**: Before version 3.0.0, the signature was: -> -> ```prisma no-lines -> @id -> ``` - #### Examples In most cases, you want your database to create the ID. To do this, annotate the ID field with the `@default` attribute and initialize the field with a [function](#attribute-functions). @@ -1500,10 +1480,10 @@ Defines a multi-field ID (composite ID) on the model. | ----------- | -------- | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `fields` | **Yes** | `FieldReference[]` | A list of field names - for example, `["firstname", "lastname"]` | | `name` | **No** | `String` | The name that Prisma Client will expose for the argument covering all fields, e.g. `fullName` in `fullName: { firstName: "First", lastName: "Last"}` | -| `map` | **No** | `String` | The name of the underlying primary key constraint in the database.

Not supported for MySQL. | -| `length` | **No** | `number` | Allows you to specify a maximum length for the subpart of the value to be indexed.

MySQL only. In preview in versions 3.5.0 and later, and in general availability in versions 4.0.0 and later. | -| `sort` | **No** | `String` | Allows you to specify in what order the entries of the ID are stored in the database. The available options are `Asc` and `Desc`.

SQL Server only. In preview in versions 3.5.0 and later, and in general availability in versions 4.0.0 and later. | -| `clustered` | **No** | `Boolean` | Defines whether the ID is clustered or non-clustered. Defaults to `true`.

SQL Server only. In preview in versions 3.13.0 and later, and in general availability in versions 4.0.0 and later. | +| `map` | **No** | `String` | The name of the underlying primary key constraint in the database. Not supported for MySQL. | +| `length` | **No** | `number` | Allows you to specify a maximum length for the subpart of the value to be indexed. MySQL only. | +| `sort` | **No** | `String` | Allows you to specify in what order the entries of the ID are stored in the database. The available options are `Asc` and `Desc`. SQL Server only. | +| `clustered` | **No** | `Boolean` | Defines whether the ID is clustered or non-clustered. Defaults to `true`. SQL Server only. | The name of the `fields` argument on the `@@id` attribute can be omitted: @@ -1518,12 +1498,6 @@ The name of the `fields` argument on the `@@id` attribute can be omitted: @@id(_ fields: FieldReference[], name: String?, map: String?) ``` -> **Note**: Until version 3.0.0, the signature was: -> -> ```prisma no-lines -> @@id(_ fields: FieldReference[]) -> ``` - #### Examples ##### Specify a multi-field ID on two `String` fields (Relational databases only) @@ -1682,12 +1656,6 @@ id Int @id @default(autoincrement()) @default(_ value: Expression, map: String?) ``` -> **Note**: Until version 3.0.0, the signature was: -> -> ```prisma no-lines -> @default(_ value: Expression) -> ``` - #### Examples ##### Default value for an `Int` @@ -2005,12 +1973,12 @@ Defines a unique constraint for this field. #### Arguments -| Name | Required | Type | Description | -| ----------- | -------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `map` | **No** | `String` | | -| `length` | **No** | `number` | Allows you to specify a maximum length for the subpart of the value to be indexed.

MySQL only. In preview in versions 3.5.0 and later, and in general availability in versions 4.0.0 and later. | -| `sort` | **No** | `String` | Allows you to specify in what order the entries of the constraint are stored in the database. The available options are `Asc` and `Desc`.

In preview in versions 3.5.0 and later, and in general availability in versions 4.0.0 and later. | -| `clustered` | **No** | `Boolean` | Defines whether the constraint is clustered or non-clustered. Defaults to `false`.

SQL Server only. In preview in versions 3.13.0 and later, and in general availability in versions 4.0.0 and later. | +| Name | Required | Type | Description | +| ----------- | -------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| `map` | **No** | `String` | | +| `length` | **No** | `number` | Allows you to specify a maximum length for the subpart of the value to be indexed. MySQL only. | +| `sort` | **No** | `String` | Allows you to specify in what order the entries of the constraint are stored in the database. The available options are `Asc` and `Desc`. | +| `clustered` | **No** | `Boolean` | Defines whether the constraint is clustered or non-clustered. Defaults to `false`. SQL Server only. | - ¹ Can be required by some of the index and field types. @@ -2020,18 +1988,6 @@ Defines a unique constraint for this field. @unique(map: String?, length: number?, sort: String?) ``` -> **Note**: Before version 4.0.0, or 3.5.0 with the `extendedIndexes` Preview feature enabled, the signature was: -> -> ```prisma no-lines -> @unique(map: String?) -> ``` - -> **Note**: Before version 3.0.0, the signature was: -> -> ```no-lines -> @unique -> ``` - #### Examples ##### Specify a unique attribute on a required `String` field @@ -2204,9 +2160,9 @@ Defines a compound [unique constraint](/orm/prisma-schema/data-model/models#defi | `fields` | **Yes** | `FieldReference[]` | A list of field names - for example, `["firstname", "lastname"]`. Fields must be mandatory - see remarks. | | `name` | **No** | `String` | The name of the unique combination of fields - defaults to `fieldName1_fieldName2_fieldName3` | | `map` | **No** | `String` | | -| `length` | **No** | `number` | Allows you to specify a maximum length for the subpart of the value to be indexed.

MySQL only. In preview in versions 3.5.0 and later, and in general availability in versions 4.0.0 and later. | -| `sort` | **No** | `String` | Allows you to specify in what order the entries of the constraint are stored in the database. The available options are `Asc` and `Desc`.

In preview in versions 3.5.0 and later, and in general availability in versions 4.0.0 and later. | -| `clustered` | **No** | `Boolean` | Defines whether the constraint is clustered or non-clustered. Defaults to `false`.

SQL Server only. In preview in versions 3.13.0 and later, and in general availability in versions 4.0.0 and later. | +| `length` | **No** | `number` | Allows you to specify a maximum length for the subpart of the value to be indexed. MySQL only. | +| `sort` | **No** | `String` | Allows you to specify in what order the entries of the constraint are stored in the database. The available options are `Asc` and `Desc`. | +| `clustered` | **No** | `Boolean` | Defines whether the constraint is clustered or non-clustered. Defaults to `false`. SQL Server only. | The name of the `fields` argument on the `@@unique` attribute can be omitted: @@ -2225,21 +2181,9 @@ The `length` and `sort` arguments are added to the relevant field names: #### Signature -> ```prisma no-lines -> @@unique(_ fields: FieldReference[], name: String?, map: String?) -> ``` - -> **Note**: Before version 4.0.0, or before version 3.5.0 with the `extendedIndexes` Preview feature enabled, the signature was: -> -> ```prisma no-lines -> @@unique(_ fields: FieldReference[], name: String?, map: String?) -> ``` - -> **Note**: Before version 3.0.0, the signature was: -> -> ```prisma no-lines -> @@unique(_ fields: FieldReference[], name: String?) -> ``` +```prisma no-lines +@@unique(_ fields: FieldReference[], name: String?, map: String?) +``` #### Examples @@ -2446,14 +2390,14 @@ While you cannot configure these option in your Prisma schema, you can still con | Name | Required | Type | Description | | ----------- | -------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `fields` | **Yes** | `FieldReference[]` | A list of field names - for example, `["firstname", "lastname"]` | -| `name` | **No** | `String` | The name that Prisma Client will expose for the argument covering all fields, e.g. `fullName` in `fullName: { firstName: "First", lastName: "Last"}` | -| `map` | **No** | `map` | The name of the index in the underlying database (Prisma generates an index name that respects identifier length limits if you do not specify a name. Prisma uses the following naming convention: `tablename.field1_field2_field3_unique`) | -| `length` | **No** | `number` | Allows you to specify a maximum length for the subpart of the value to be indexed.

MySQL only. In preview in versions 3.5.0 and later, and in general availability in versions 4.0.0 and later. | -| `sort` | **No** | `String` | Allows you to specify in what order the entries of the index or constraint are stored in the database. The available options are `asc` and `desc`.

In preview in versions 3.5.0 and later, and in general availability in versions 4.0.0 and later. | -| `clustered` | **No** | `Boolean` | Defines whether the index is clustered or non-clustered. Defaults to `false`.

SQL Server only. In preview in versions 3.5.0 and later, and in general availability in versions 4.0.0 and later. | -| `type` | **No** | `identifier` | Allows you to specify an index access method. Defaults to `BTree`.

PostgreSQL and CockroachDB only. In preview with the `Hash` index access method in versions 3.6.0 and later, and with the `Gist`, `Gin`, `SpGist` and `Brin` methods added in 3.14.0. In general availability in versions 4.0.0 and later. | -| `ops` | **No** | `identifier` or a `function` | Allows you to define the index operators for certain index types.

PostgreSQL only. In preview in versions 3.14.0 and later, and in general availability in versions 4.0.0 and later. | +| `fields` | **Yes** | `FieldReference[]` | A list of field names - for example, `["firstname", "lastname"]` | +| `name` | **No** | `String` | The name that Prisma Client will expose for the argument covering all fields, e.g. `fullName` in `fullName: { firstName: "First", lastName: "Last"}` | +| `map` | **No** | `map` | The name of the index in the underlying database (Prisma generates an index name that respects identifier length limits if you do not specify a name. Prisma uses the following naming convention: `tablename.field1_field2_field3_unique`) | +| `length` | **No** | `number` | Allows you to specify a maximum length for the subpart of the value to be indexed. MySQL only. | +| `sort` | **No** | `String` | Allows you to specify in what order the entries of the index or constraint are stored in the database. The available options are `asc` and `desc`. | +| `clustered` | **No** | `Boolean` | Defines whether the index is clustered or non-clustered. Defaults to `false`. SQL Server only. | +| `type` | **No** | `identifier` | Allows you to specify an index access method. Defaults to `BTree`. PostgreSQL and CockroachDB only. | +| `ops` | **No** | `identifier` or a `function` | Allows you to define the index operators for certain index types. PostgreSQL only. | The _name_ of the `fields` argument on the `@@index` attribute can be omitted: @@ -2475,14 +2419,6 @@ The `length` and `sort` arguments are added to the relevant field names: @@index(_ fields: FieldReference[], map: String?) ``` -> **Note**: Until version 3.0.0, the signature was: -> -> ```prisma no-lines -> @@index(_ fields: FieldReference[], name: String?) -> ``` -> -> The old `name` argument will still be accepted to avoid a breaking change. - #### Examples Assume you want to add an index for the `title` field of the `Post` model @@ -2589,12 +2525,6 @@ With SQLite, the signature changes to: @relation(_ name: String?, fields: FieldReference[]?, references: FieldReference[]?, onDelete: ReferentialAction?, onUpdate: ReferentialAction?) ``` -> **Note**: Until version 3.0.0, the signature was: -> -> ```prisma no-lines -> @relation(_ name: String?, fields: FieldReference[]?, references: FieldReference[]?) -> ``` - #### Examples See: [The `@relation` attribute](/orm/prisma-schema/data-model/relations#the-relation-attribute). @@ -3400,7 +3330,7 @@ model User { -**Note**: [`gen_random_uuid()` is a PostgreSQL function](https://www.postgresql.org/docs/13/functions-uuid.html). To use it in PostgreSQL versions 12.13 and earlier, you must enable the `pgcrypto` extension.

In Prisma ORM versions 4.5.0 and later, you can declare the `pgcrypto` extension in your Prisma schema with the [`postgresqlExtensions` preview feature](/orm/prisma-schema/postgresql-extensions). +**Note**: [`gen_random_uuid()` is a PostgreSQL function](https://www.postgresql.org/docs/13/functions-uuid.html). To use it in PostgreSQL versions 12.13 and earlier, you must enable the `pgcrypto` extension.
@@ -3514,17 +3444,11 @@ model User { ## `type` - +:::warning Composite types are available **for MongoDB only**. - - - - -Composite types are available in versions 3.12.0 and later, and in versions 3.10.0 and later if you enable the `mongodb` Preview feature flag. - - +::: Defines a [composite type](/orm/prisma-schema/data-model/models#defining-composite-types) . diff --git a/content/200-orm/500-reference/200-prisma-cli-reference.mdx b/content/200-orm/500-reference/200-prisma-cli-reference.mdx index 9ec2d2657b..b1bbbf2b4f 100644 --- a/content/200-orm/500-reference/200-prisma-cli-reference.mdx +++ b/content/200-orm/500-reference/200-prisma-cli-reference.mdx @@ -443,15 +443,6 @@ prisma generate --generator client --generator zod_schemas The `prisma-client-js` generator creates a customized client for working with your database within the `./node_modules/.prisma/client` directory by default - you can [customize the output folder](/orm/prisma-client/setup-and-configuration/generating-prisma-client#using-a-custom-output-path). -### `introspect` - - - -**Deprecation warning**
-From Prisma ORM 3.0.0 onwards, the `prisma introspect` command is deprecated and replaced with the [`prisma db pull`](#db-pull) command. - -
- ### `validate` Validates the [Prisma Schema Language](/orm/prisma-schema) of the Prisma schema file. @@ -651,7 +642,6 @@ For hiding messages For downloading engines - PRISMA_ENGINES_MIRROR: - - PRISMA_BINARIES_MIRROR (deprecated): - PRISMA_ENGINES_CHECKSUM_IGNORE_MISSING: - BINARY_DOWNLOAD_VERSION: @@ -914,8 +904,6 @@ prisma db push --schema=/tmp/schema.prisma ### `db seed` -`db seed` changed from Preview to Generally Available (GA) in 3.0.1. - See [Seeding your database](/orm/prisma-migrate/workflows/seeding) #### Options @@ -925,8 +913,6 @@ See [Seeding your database](/orm/prisma-migrate/workflows/seeding) | `--help` / `--h` | No | Displays the help message | | `--` | No | Allows the use of custom arguments defined in a seed file | -The `--` argument/ [delimiter](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_12_02)/ double-dash is available from version 4.15.0 or later. - #### Examples ```terminal @@ -935,12 +921,6 @@ prisma db seed ### `db execute` - - -The `db execute` command is Generally Available in versions 3.13.0 and later. If you're using a version between 3.9.0 and 3.13.0, it is available behind a `--preview-feature` CLI flag. - - - This command is currently not supported on [MongoDB](/orm/overview/databases/mongodb). @@ -1213,7 +1193,7 @@ The migrations from the database are not found locally in prisma/migrations: 20201208100950_new_migration ``` -In versions 4.3.0 and later, `prisma migrate status` exits with exit code 1 in the following cases: +`prisma migrate status` exits with exit code 1 in the following cases: - a database connection error occurs - there are migration files in the `migrations` directory that have not been applied to the database @@ -1241,12 +1221,6 @@ prisma migrate status ### `migrate diff` - - -The `migrate diff` command is Generally Available in versions 3.13.0 and later. If you're using a version between 3.9.0 and 3.13.0, it is available behind a `--preview-feature` CLI flag. - - - This command is only partially supported for [MongoDB](/orm/overview/databases/mongodb). See the command options below for details. @@ -1467,8 +1441,6 @@ The path to the desired `schema.prisma` file can be specified with the `prisma.s } ``` -This is available from version 2.7.0 and later. - ### `seed` The command used to populate the datasource is specified in the `prisma.seed` entry in the `package.json` file. It is used when `prisma db seed` is invoked or triggered. @@ -1485,8 +1457,6 @@ See [Seeding your database](/orm/prisma-migrate/workflows/seeding) } ``` -This is available from version 3.0.1 and later. - ## Using a HTTP proxy for the CLI Prisma CLI supports [custom HTTP proxies](https://github.com/prisma/prisma/issues/506). This is particularly relevant when being behind a corporate firewall. diff --git a/content/200-orm/500-reference/250-error-reference.mdx b/content/200-orm/500-reference/250-error-reference.mdx index dcc7673a7b..f5f64f210f 100644 --- a/content/200-orm/500-reference/250-error-reference.mdx +++ b/content/200-orm/500-reference/250-error-reference.mdx @@ -120,8 +120,6 @@ Prisma Client throws a `PrismaClientValidationError` exception if validation fai #### `P1012` -**Note:** If you get error code P1012 after you upgrade Prisma ORM to version 4.0.0 or later, see the [version 4.0.0 upgrade guide](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-4#upgrade-your-prisma-schema). A schema that was valid before version 4.0.0 might be invalid in version 4.0.0 and later. The upgrade guide explains how to update your schema to make it valid. - "\{full_error}" Possible P1012 error messages: diff --git a/content/200-orm/500-reference/300-environment-variables-reference.mdx b/content/200-orm/500-reference/300-environment-variables-reference.mdx index 407c6bf4fe..a4863ee6ab 100644 --- a/content/200-orm/500-reference/300-environment-variables-reference.mdx +++ b/content/200-orm/500-reference/300-environment-variables-reference.mdx @@ -157,16 +157,8 @@ PRISMA_ENGINES_MIRROR=https://example.org/custom-engines/ See [Prisma engines](/orm/more/under-the-hood/engines#hosting-engines) for a conceptual overview of how to use this environment variable. -Note: This environment variable used to be available as `PRISMA_BINARIES_MIRROR`, which was deprecated in Prisma ORM 3.0.1. It is discouraged to use anymore and will be removed in the future. - #### `PRISMA_ENGINES_CHECKSUM_IGNORE_MISSING` - - -This environment variable is available since version `4.16.0` - - - `PRISMA_ENGINES_CHECKSUM_IGNORE_MISSING` can be can be set to a truthy value to ignore problems around downloading & verifying the integrity (via a checksum file) of the Prisma ORM engines. This is particularly useful when deploying to an offline system environment where the checksum file cannot be downloaded. @@ -230,40 +222,6 @@ PRISMA_SCHEMA_ENGINE_BINARY=custom/my-schema-engine-unix PRISMA_MIGRATION_ENGINE_BINARY=custom/my-migration-engine-unix ``` -#### `PRISMA_INTROSPECTION_ENGINE_BINARY` - -`PRISMA_INTROSPECTION_ENGINE_BINARY` is used to set a custom location for your own introspection engine binary. - -```env -PRISMA_INTROSPECTION_ENGINE_BINARY=custom/my-introspection-engine-unix -``` - - - -The Introspection Engine is served by the Migration Engine from [4.9.0](https://github.com/prisma/prisma/releases/tag/4.9.0). Therefore, the `PRISMA_INTROSPECTION_ENGINE` environment variable will not be used. - - - -#### `PRISMA_FMT_BINARY` - - - -This functionality has been removed in Prisma CLI version 4.10.0. It only works in earlier versions. - - - -`PRISMA_FMT_BINARY` is used to set a custom location for your own format engine binary. - -```env -PRISMA_FMT_BINARY=custom/my-custom-format-engine-unix -``` - - - -The `PRISMA_FMT_BINARY` variable is used in versions [4.2.0](https://github.com/prisma/prisma/releases/tag/4.2.0) or lower. - - - ### CLI Binary Targets #### `PRISMA_CLI_BINARY_TARGETS` diff --git a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/700-upgrading-to-prisma-4.mdx b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/700-upgrading-to-prisma-4.mdx deleted file mode 100644 index ff95e20ff9..0000000000 --- a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/700-upgrading-to-prisma-4.mdx +++ /dev/null @@ -1,495 +0,0 @@ ---- -title: 'Upgrade to Prisma ORM 4' -metaTitle: 'Upgrade to Prisma ORM 4' -metaDescription: 'Guides on how to upgrade to Prisma ORM 4' -tocDepth: 3 -toc: true ---- - - - -Prisma ORM 4 introduces a number of **breaking changes** when you upgrade from an earlier Prisma ORM version. This guide explains how this upgrade might affect your application and gives instructions on how to handle any changes. - - - -## Breaking changes - -This section gives an overview of breaking changes in Prisma ORM 4, grouped under [general changes](#general-changes) that affect both the Prisma Schema and Prisma Client, [Schema changes](#schema-changes) and [Client changes](#client-changes). - -We recommend that you first address any Prisma schema validation errors, then pull your database to reflect new Prisma schema capabilities, and finally fix any type errors in Prisma Client and validate by running your test suite. - -### Upgrade your Prisma Schema - -1. Carefully skim the list of changes and check if you are impacted by a breaking change. -2. Review the Prisma schema validation errors (via `npx prisma validate`, or via the Prisma VS Code extension). - 1. If you don't have validation errors, continue with step 3. - 2. If you have validation errors: - 1. Try to map the validation error to a change from the list below to understand which change caused the invalid Prisma schema, and read the linked instructions for how to upgrade. It can only come from: - - [Explicit unique constraints for 1:1 relations](#explicit-unique-constraints-on-one-to-one-relations) - - [Removed support for usage of `references` on implicit many-to-many relations](#disallow-references-syntax-for-implicit-many-to-many-relations) - - [Enforced uniqueness of referenced fields in the `references` argument in one-to-one and one-to-many relations for MySQL and MongoDB](#enforced-use-of-unique-or-id-attribute-for-one-to-one-and-one-to-many-relations-mysql-and-mongodb) - - Removal of undocumented support for the `type` alias - - Removal of the `sqlite` protocol for SQLite URLs - - [Better grammar for string literals](#better-grammar-for-string-literals) -3. Repeat until your Prisma schema is valid. -4. Run `npx prisma db pull` to upgrade the Prisma schema to all new capabilities (e.g. `extendedIndexes`). -5. Review changes of the Prisma schema and verify validity. -6. Continue with Prisma Client steps. - -### Upgrade your use of Prisma Client - -1. Carefully skim the [list of changes](#client-changes) to understand if you are impacted by a breaking change. - 1. If yes, read the detailed upgrade instructions. - 2. If no, proceed with 2. -2. Some API changes in Prisma Client are impacting runtime behavior, so please run your test suite. - -Enjoy Prisma ORM 4! - -### General changes - -This section includes changes that affect both the Prisma Schema and Prisma Client. - -#### Node.js minimum version change - -From Prisma ORM version 4.0.0, the minimum version of Node.js that we support is 14.17.x. If you use an earlier version of Node.js, you will need to update it. - -See our [system requirements](/orm/reference/system-requirements) for all minimum version requirements. - -### Schema changes - -This section includes changes that affect the Prisma Schema. - -#### Index configuration - -In Prisma ORM 4, the `extendedIndexes` Preview feature will now become generally available. This includes the following index configuration options: - -- Length configuration of indexes, unique constraints and primary key constraints for MySQL (in Preview in versions 3.5.0 and later) -- Sort order configuration of indexes, unique constraints and primary key constraints (in Preview in versions 3.5.0 and later) -- New index types for PostgreSQL: Hash (in Preview in versions 3.6.0 and later) and GIN, GiST, SP-GiST and BRIN (in Preview in versions 3.14.0 and later) -- Index clustering for SQL Server (in Preview in versions 3.13.0 and later) - -See our documentation on [Index configuration](/orm/prisma-schema/data-model/indexes#index-configuration) for more details of these features. - -##### Upgrade path - -These can all be breaking changes if you were previously configuring these properties at the database level. In this case, you will need to: - -1. Upgrade to the new Prisma ORM 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-version-4) -1. Run `npx prisma db pull` afterwards to retrieve any existing configuration of indexes and constraints. This needs to be done before running any `npx prisma db push` or `npx prisma migrate dev` command, or you may lose any configuration that was defined in the database but not previously represented in the Prisma schema. - -For more details, see the [Upgrading from previous versions](/orm/prisma-schema/data-model/indexes#upgrading-from-previous-versions) section of our index configuration documentation. - -#### Scalar list defaults - -For database connectors that support scalar lists (PostgreSQL, CockroachDB and MongoDB), Prisma ORM 4 introduces the ability to set a default value in your Prisma schema with the `@default` attribute: - - - - -```prisma highlight=4;normal -model User { - id Int @id @default(autoincrement()) - posts Post[] - //highlight-next-line - favoriteColors String[] @default(["red", "yellow", "purple"]) -} -``` - - - - -```prisma highlight=4;normal -model User { - id String @id @default(auto()) @map("_id") @db.ObjectId - posts Post[] - //highlight-next-line - favoriteColors String[] @default(["red", "yellow", "purple"]) -} -``` - - - - -##### Upgrade path - -This is a breaking change if you previously had defaults defined for scalar lists at the database level. In this case, you will need to: - -1. Upgrade to the new Prisma ORM 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-version-4) -1. Run `npx prisma db pull` afterwards to retrieve any existing configuration of indexes and constraints. This needs to be done before running any `npx prisma db push` or `npx prisma migrate dev` command, or you will lose any defaults that are defined in the database but not previously represented in the Prisma schema. - -#### Explicit `@unique` constraints on one-to-one relations - -When using one-to-one relations in Prisma ORM 4, you will need to explicitly add the `@unique` attribute to the relation scalar field. For example, for this one-to-one relation between a `User` and a `Profile` model, you will need to add the `@unique` attribute to the `profileId` field: - - - - -```prisma -model User { - id Int @id @default(autoincrement()) - profile Profile? @relation(fields: [profileId], references: [id]) - profileId Int? @unique // <-- include this explicitly -} - -model Profile { - id Int @id @default(autoincrement()) - user User? -} -``` - - - - -```prisma -model User { - id String @id @default(auto()) @map("_id") @db.ObjectId - profile Profile? @relation(fields: [profileId], references: [id]) - profileId String? @unique @db.ObjectId // <-- include this explicitly -} - -model Profile { - id String @id @default(auto()) @map("_id") @db.ObjectId - user User? -} -``` - - - - -##### Upgrade path - -After you upgrade to Prisma ORM 4, any one-to-one relations without a `@unique` attribute on the relation scalar will trigger a validation error. To upgrade, you will need to: - -1. Upgrade to the new Prisma ORM 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-version-4) - -1. Manually fix the validation errors in your Prisma schema by adding the explicit `@unique` or `@id` attribute to your data model. -1. Push the changes to your database using `prisma db push` for MongoDB or `prisma migrate dev` for MySQL. - -#### Enforced use of `@unique` or `@id` attribute for one-to-one and one-to-many relations (MySQL and MongoDB) - -When you use one-to-one and one-to-many relations in Prisma ORM 4, you will need to use a `@unique` attribute on the relation field to guarantee that the singular side(s) of the relation has only one record. This is now enforced for MySQL and MongoDB, bringing them into line with other connectors. Missing `@unique` attributes will now trigger a validation error. - -In the following example of a _one-to-many relation_ between a `User` and `Post` model, the `@unique` attribute must be added to the `email` field: - - - - -```prisma -model User { - id Int @id @default(autoincrement()) - email String @unique // <-- we enforce this attribute - posts Post[] -} - -model Post { - id Int @id @default(autoincrement()) - authorEmail String - author User @relation(fields: [authorEmail], references: [email]) -} -``` - - - - -```prisma -model User { - id Int @id @default(auto()) @map("_id") @db.ObjectId - email String @unique // <-- we enforce this attribute - posts Post[] -} - -model Post { - id Int @id @default(auto()) @map("_id") @db.ObjectId - authorEmail String - author User @relation(fields: [authorEmail], references: [email]) -} -``` - - - - -In the following example of a _one-to-one relation_ between a `User` and `Profile` model, the `@unique` attribute must be added to the `email` field: - - - - -```prisma -model User { - id Int @id @default(autoincrement()) - email String @unique // <- we enforce this unique attribute - profile Profile @relation(fields: [profileId], references: [id]) - profileId Int -} - -model Profile { - id Int @id @default(autoincrement()) - userEmail String? @unique - user User? -} -``` - - - - -```prisma -model User { - id Int @id @default(auto()) @map("_id") @db.ObjectId - email String @unique // <- we enforce this unique attribute - profile Profile @relation(fields: [profileId], references: [id]) - profileId Int @db.ObjectId -} - -model Profile { - id Int @id @default(auto()) @map("_id") @db.ObjectId - userEmail String? @unique - user User? @relation(fields: [userEmail], references: [email]) -} -``` - - - - -##### Upgrade path - -After you upgrade to Prisma ORM 4, any one-to-one or one-to-many relations without a `@unique` or `@id` attribute on the relation field will trigger a validation error. To upgrade, you will need to: - -1. Upgrade to the new Prisma ORM 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-version-4) -1. Manually fix the validation errors in your Prisma schema. Alternatively, if you have an up-to-date live database, running `npx prisma db pull` will add the `@unique` attributes automatically. - -#### Disallow `references` syntax for implicit many-to-many relations - -When using [implicit many-to-many relations](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations) in Prisma ORM 4, you will no longer be able to use the `references` argument, which was previously optional. For example, the following relation would now trigger a validation error: - -```prisma file=schema.prisma showLineNumbers -model Post { - id Int @id @default(autoincrement()) - categories Category[] @relation("my-relation", references: [id]) // <-- validation error -} - -model Category { - id Int @id @default(autoincrement()) - posts Post[] @relation("my-relation", references: [id]) // <-- validation error -} -``` - -Instead, you can write: - -```prisma file=schema.prisma showLineNumbers -model Post { - id Int @id @default(autoincrement()) - categories Category[] @relation("my-relation") -} - -model Category { - id Int @id @default(autoincrement()) - posts Post[] @relation("my-relation") -} -``` - -This is because the only valid value for `references` was `id`, so removing this argument makes it clearer what can and cannot be changed. - -##### Upgrade path - -After you upgrade to Prisma ORM 4, any implicit many-to-many relations with a `references` argument will trigger a validation error. To upgrade, you will need to: - -1. Upgrade to the new Prisma ORM 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-version-4) -1. Manually fix the validation errors in your Prisma schema. Alternatively, if you have an up-to-date live database, running `npx prisma db pull` will remove the `references` arguments automatically. - -#### Better grammar for string literals - -String literals in your Prisma Schema now need to follow the same rules as strings in JSON. This mostly changes the escaping of some special characters. More details can be found in [the JSON specification](https://www.ietf.org/rfc/rfc4627.txt) or on the [JSON website](https://www.json.org/json-en.html). - -##### Upgrade path - -This is a breaking change for some existing schemas. After you upgrade to Prisma ORM 4, incorrectly escaped characters will trigger a validation error. To upgrade, you will need to: - -1. Upgrade to the new Prisma ORM 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-version-4) -1. Manually fix the validation errors in your Prisma schema. - -### Client changes - -This section includes changes that affect Prisma Client. - -#### Raw query type mapping: scalar values are now deserialized as their correct JavaScript types - -In versions 3.14.x and 3.15.x, [raw query type mapping](/orm/prisma-client/using-raw-sql/raw-queries#raw-query-type-mapping) was available with the Preview feature `improvedQueryRaw`. In version 4.0.0, we have made raw query type mapping Generally Available. You do not need to use `improvedQueryRaw` to get this functionality in versions 4.0.0 and later. - -Raw queries now deserialize scalar values to their corresponding JavaScript types. Note that Prisma ORM infers types from the values themselves and not from the Prisma Schema types. - -Example query and response: - -```ts -const res = - await prisma.$queryRaw`SELECT bigint, bytes, decimal, date FROM "Table";` -console.log(res) // [{ bigint: BigInt("123"), bytes: Buffer.from([1, 2]), decimal: new Prisma.Decimal("12.34"), date: Date("") }] -``` - -##### Upgrade path - -From version 4.0.0, some data types returned by `queryRaw` or `queryRawUnsafe` are different, as follows: - -| Data type | Before version 4.0.0 | From version 4.0.0 | -| ---------- | --------------------- | --------------------- | -| `DateTime` | Returned as `String` | Returned as `Date` | -| `Numeric` | Returned as `Float` | Returned as `Decimal` | -| `Bytes` | Returned as `String` | Returned as `Buffer` | -| `Int64` | Returned as `Integer` | Returned as `BigInt` | - -If you use `queryRaw` or `queryRawUnsafe` to return any of the above data types, then you must change your code to handle the new types. - -For example, if you return `DateTime` data, then you need to take into account the following: - -- You no longer need to manually instantiate a `DateTime` object for the returned data. -- If your code currently uses the returned `String` data, then you now need to convert the `DateTime` object to a `String`. - -You must make equivalent code changes for the other data types in the table above. - -#### Raw query mapping: PostgreSQL type-casts - -In versions 3.14.x and 3.15.x, [raw query type mapping](/orm/prisma-client/using-raw-sql/raw-queries#raw-query-type-mapping) was available with the Preview feature `improvedQueryRaw`. In version 4.0.0, we have made raw query type mapping Generally Available. You do not need to use `improvedQueryRaw` to get this functionality in versions 4.0.0 and later. - -Before version 4.0.0, many PostgreSQL type-casts did not work. We have tightened the type coercion rules so that all type-casts now work. As a result, some implicit casts now fail. - -##### Upgrade path - -We recommend that you re-test your use of `$queryRaw` to ensure that the types you pass into your raw queries match the types that PostgreSQL expects. - -For example, in version 4.0.0, the following query fails: - -```js -await prisma.$queryRaw`select length(${42});` -// ERROR: function length(integer) does not exist -// HINT: No function matches the given name and argument types. You might need to add explicit type casts. -``` - -This is because PostgreSQL’s `length` function expects `text` as input. Prisma ORM used to silently coerce `42` to `text`, but does not do this in version 4.0.0. To fix this, explicitly cast `42` to `text` as follows: - -```js -await prisma.$queryRaw`select length(${42}::text);` -``` - -#### Raw query mapping: PostgreSQL and JavaScript integers - -In versions 3.14.x and 3.15.x, [raw query type mapping](/orm/prisma-client/using-raw-sql/raw-queries#raw-query-type-mapping) was available with the Preview feature `improvedQueryRaw`. In version 4.0.0, we have made raw query type mapping Generally Available. You do not need to use `improvedQueryRaw` to get this functionality in versions 4.0.0 and later. - -Prisma ORM sends JavaScript integers to PostgreSQL as `INT8`. This might conflict with your user-defined functions that accept only `INT4` as input. - -##### Upgrade path - -If you use `$queryRaw` or parametrized `$queryRawUnsafe`queries with a PostgreSQL database, do one of the following: - -- Update the input types of any integers in your user-defined functions to `INT8`, or -- Cast any integers in your query parameters to `INT4`. - -#### `DbNull`, `JsonNull` and `AnyNull` are now objects - -JavaScript `null` is ambiguous for JSON columns, so Prisma ORM uses `DbNull`, `JsonNull`, and `AnyNull` to distinguish between the database `NULL` value and the JSON `null` value. Before version 4.0.0, `DbNull`, `JsonNull`, and `AnyNull` were string constants. From version 4.0.0, they are objects. - -See [Filtering by null values](/orm/prisma-client/special-fields-and-types/working-with-json-fields#filtering-by-null-values) for more information. - -##### Upgrade path - -1. If you use literal strings to address these values, then you must replace them with the following named constants: - - - `DbNull`: replace with `Prisma.DbNull` - - `JsonNull`: replace with `Prisma.JsonNull` - - `AnyNull`: replace with `Prisma.AnyNull` - - If you already use these named constants, then you do not need to take any action. - -1. If you now get a type error when you pass `Prisma.DbNull` as the value of a JSON field, then this probably indicates a bug in your code that our types did not catch before version 4.0.0. The field where you tried to store `DbNull` is probably not nullable in your schema. As a result, a literal `DbNull` string was stored in the database instead of `NULL`. -1. You might now encounter a type error or runtime validation error when you use `Prisma.DbNull`, `Prisma.JsonNull`, or `Prisma.AnyNull` with MongoDB. This was never valid, but was silently accepted prior to Prisma ORM 4. You need to review your data and change these fields to `null`. -1. If you pass in dynamic JSON to a JSON column in Prisma Client (for example `prisma.findMany({where: { jsonColumn: someJson } })`), then you must check that `someJson`cannot be the string "DBNull", "JsonNull", or "AnyNull". If it is any of these values, then the query will return different results in version 4.0.0. - -#### Default fields on composite types in MongoDB - -From version 4.0.0, if you carry out a database read on a composite type when all of the following conditions are true, then Prisma Client inserts the default value into the result. - -Conditions: - -- A field on the composite type is required, and -- this field has a default value, and -- this field is not present in the returned document or documents. - -This behavior is now consistent with the behavior for model fields. - -To learn more, see [Default values for required fields on composite types](/orm/prisma-client/special-fields-and-types/composite-types#default-values-for-required-fields-on-composite-types). - -##### Upgrade path - -If you currently rely on a return value of `null`, then you need to refactor your code to handle the default value that is now returned in Prisma ORM 4. - -#### Rounding errors on big numbers in SQLite - -SQLite is a loosely-typed database. If your schema has a field with type `Int`, then Prisma ORM prevents you from inserting a value larger than an integer. However, nothing prevents the database from directly accepting a bigger number. These manually-inserted big numbers cause rounding errors when queried. - -To avoid this problem, Prisma ORM version 4.0.0 and later checks numbers on the way out of the database to verify that they fit within the boundaries of an integer. If a number does not fit, then Prisma ORM throws a P2023 error, such as: - -``` -Inconsistent column data: Conversion failed: -Value 9223372036854775807 does not fit in an INT column, -try migrating the 'int' column type to BIGINT -``` - -##### Upgrade path - -If you use Prisma ORM in conjunction with SQLite, then you need to find any code that queries `Int` fields and ensure that it handles any P2023 errors that might be returned. - -#### Prisma ORM no longer exports `Prisma.dmmf.schema` into the generated Prisma Client - -From version 4.0.0, Prisma ORM no longer exports `Prisma.dmmf.schema` into the generated Prisma Client. This makes the generated Prisma Client much more efficient, and also avoids some memory leaks with Jest. - -Note: - -- This change does not affect the DMMF that Prisma ORM passes to the generators. -- You can use `getDmmf()`from `@prisma/internals` to access the schema property. -- We still export `Prisma.dmmf.datamodel` into the generated Prisma Client. - -## Upgrade the `prisma` and `@prisma/client` packages to version 4 - -To upgrade to Prisma ORM 4 from an earlier version, you need to update both the `prisma` and `@prisma/client` packages. Both the `prisma` and `@prisma/client` packages install with a caret `^` in their version number. This allows upgrades to new minor versions, but not major versions, to safeguard against breaking changes. - -To ignore the caret `^` and upgrade across major versions, you can use the `@4` tag when you upgrade with `npm`, or `yarn`: - - - -Before you upgrade, check each **breaking change** to see how the upgrade might affect your application. - - - - - - - -```terminal -npm install prisma@4 @prisma/client@4 -``` - - - - - -```terminal -yarn up prisma@4 @prisma/client@4 -``` - - - - - -## Video guide - -For a video walkthrough of the upgrade process and examples of upgrade scenarios, see our recorded livestream on upgrading to Prisma ORM 4: - -
- - - -
diff --git a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/100-named-constraints.mdx b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/100-named-constraints.mdx deleted file mode 100644 index 04964bbc95..0000000000 --- a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/100-named-constraints.mdx +++ /dev/null @@ -1,165 +0,0 @@ ---- -title: 'Named constraints upgrade path' -metaTitle: 'Named constraints upgrade path' -metaDescription: 'Guides on how to handle named constraints using Prisma Introspect or Prisma Migrate when upgrading to Prisma 3' -tocDepth: 3 -toc: true ---- - - - -After upgrading to Prisma ORM 3, the default naming convention for constraint and index names will change and your primary and foreign key names will now be part of the schema for databases that support them. Therefore the meaning of your existing Prisma schema will change. - -Before you continue to evolve your schema and your database, you should decide which names for constraints and indexes you want to use on your project going forward. - -You can either keep the names as they exist in your database or you can switch to use the names generated by Prisma ORM, which follow the new naming convention. - -This page describes the manual upgrade steps that you need to perform after upgrading to Prisma ORM 3. You can pick either of the two options: - -- **Option 1**: [I want to maintain my existing constraint and index names](#option-1-i-want-to-maintain-my-existing-constraint-and-index-names) -- **Option 2**: [I want to use Prisma ORM's default constraint and index names](#option-2-i-want-to-use-prisma-orms-default-constraint-and-index-names) - - - -## Option 1: I want to maintain my existing constraint and index names - -If you want to keep your database unchanged and keep the existing names for constraints and indexes you need to pull them into your schema so Prisma ORM is aware of them. - -Reasons to keep your existing names might be: - -- Naming conventions you have to follow -- Other tooling relying on the names -- Personal preference - -To keep existing names, run `prisma db pull` against the target environment. This will result in all names that do not match Prisma ORM's naming convention for constraint and index names being pulled into your schema as `map` arguments on their respective attributes. - -1. Example schema: - - ```prisma - model User { - id Int @id @default(autoincrement()) - name String @unique - posts Post[] - } - - model Post { - id Int @id @default(autoincrement()) - title String - authorName String @default("Anonymous") - author User? @relation(fields: [authorName], references: [name]) - } - ``` - -1. Introspect your **development database** to populate the Prisma schema with constraint and index names in your underlying database _that do not match Prisma ORM's naming convention_: - - ```terminal - npx prisma db pull - ``` - - In this example, the highlighted constraints did not conform to Prisma ORM's default naming convention and now include the `map` attribute field: - - ```prisma highlight=11;normal - model User { - id Int @id(map: "Custom_Constraint_Name") @default(autoincrement()) - name String @unique - posts Post[] - } - - model Post { - id Int @id @default(autoincrement()) - title String - authorName String @default("Anonymous") - //highlight-next-line - author User? @relation(fields: [authorName], references: [name], map: "Custom_Foreign_Key_Constraint") - } - ``` - -## Option 2: I want to use Prisma ORM's default constraint and index names - -If you want to keep your Prisma Schema clean and if you have no reasons preventing you from renaming constraints and indexes in your database, then you can create a migration to update the names. - -Run `prisma migrate dev` to create a migration updating the constraint names to Prisma ORM's defaults. - -Afterwards, do not forget to `prisma migrate deploy` against your production environment if you have one to also update the names there. The schema below has no explicit constraint or index names spelled out, so Prisma ORM will infer them. - -1. Example schema: - - ```prisma - model User { - name String @id //inferred as User_pkey - posts Post[] - } - - model Post { - id Int @id @default(autoincrement()) //inferred as Post_pkey - authorName String @default("Anonymous") - author User? @relation(fields: [authorName], references: [name]) //inferred as Post_authorName_fkey - } - ``` - -1. Run the `prisma migrate dev` command to generate a new migration: - - ```terminal - npx prisma migrate dev - ``` - - This migration renames any constraints that do not currently follow Prisma ORM's naming convention. - -1. Run the [`prisma migrate deploy`](/orm/prisma-client/deployment/deploy-database-changes-with-prisma-migrate) command to apply the migration to your production environment: - - ```terminal - npx prisma migrate deploy - ``` - -## Dealing with cases where more than one database environment is used for the same application - -### Checking whether your environments use identical names - -Since Prisma ORM did not offer a way to define constraint or index names explicitly in the past, you can face situations where your different database environments have differing constraint or index names. - -In order to detect this: - -- Create a backup of your current `schema.prisma` file. -- Run `prisma db pull` against each database environment, by saving the results to their own separate files using the `--schema` option. [See reference](/orm/reference/prisma-cli-reference#arguments-1) - -Then you can either manually inspect both files or use a `diff` tool in your IDE or in the terminal. If you see differences in constraint names, your production and local environments are out of sync and should be aligned. - -In the following example, the `Post` model has a foreign key constraint with a custom name in production that does not match development. - -#### Development environment: - -```prisma highlight=5;normal -model Post { - id Int @id @default(autoincrement()) - title String - authorName String @default("Anonymous") - //highlight-next-line - author User? @relation(fields: [authorName], references: [name], map: "Custom_Foreign_Key_Constraint") -} -``` - -#### Production environment: - -```prisma highlight=5;normal -model Post { - id Int @id @default(autoincrement()) - title String - authorName String @default("Anonymous") - //highlight-next-line - author User? @relation(fields: [authorName], references: [name], map: "Custom_Production_Name") -} -``` - -### Aligning your environments if their constraint or index names differ - -If the names in your environments differ, the safest option is to align your development environment with the names in your production environment. This makes sure that no changes need to be performed on your production database. - -In order to achieve this: - -- Run `prisma db pull` against your production environment to pull in the constraint and index names -- Switch to development and run `prisma migrate dev` to create a new migration. You can call that migration `migration-to-sync-names` -- Switch to production, and run `prisma migrate resolve --applied migration-to-sync-names` to mark the migration as applied on production - -Your migration history now contains a migration to ensure that the names of any new environments you spin up contain the same names as your production database. And Prisma ORM knows not to apply this migration to production since you already marked it as applied. - -Your environments are now in sync and you can proceed to the [upgrade paths for migrate users](#option-2-i-want-to-use-prisma-orms-default-constraint-and-index-names). These let you choose your future naming scheme. diff --git a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/150-referential-actions.mdx b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/150-referential-actions.mdx deleted file mode 100644 index a099b97d22..0000000000 --- a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/150-referential-actions.mdx +++ /dev/null @@ -1,206 +0,0 @@ ---- -title: 'Referential actions upgrade path' -metaTitle: 'Referential actions upgrade path' -metaDescription: 'Guides on how to deal with referential actions using Prisma Introspect or Prisma Migrate when upgrading to Prisma 3' -tocDepth: 4 -toc_max_heading_level: 4 -toc: true ---- - - - -Prisma ORM version 2.x prevents deletion of connected records in some Prisma Client functions, and does not let you configure referential actions in your Prisma Schema to change that behavior. - -Prisma ORM version 3.x and later lets you control what should happen when deleting or updating records by explicitly setting referential actions on your models' relations. After the upgrade, Prisma Client will not enforce any referential actions anymore, and any action written to the database foreign keys will define the behavior when deleting or updating records. - -Prisma Migrate 3.x will use the actions previously done by Prisma Client as the new default when writing the foreign key constraints to the database. - - - -## Prisma ORM 2.x behavior - -When invoking the [`delete()`](/orm/prisma-client/queries/crud#delete-a-single-record) or [`deleteAll()`](/orm/prisma-client/queries/crud#delete-all-records) methods using Prisma Client on required relations, a runtime check is performed and the deletion of records prevented if they are referencing related objects. **This prevents cascade behavior, no matter how the foreign key is defined**. - -The behavior in Prisma ORM 2, without upgrading, does not allow setting referential actions at all. [See Prisma ORM 2.x default referential actions](#prisma-orm-2x-default-referential-actions) - -If you need to actually use the cascade behavior configured in the database, you _can_ use [`raw`](/orm/prisma-client/using-raw-sql/raw-queries) SQL queries to [delete multiple referenced records](/orm/prisma-client/queries/crud#deleting-all-data-with-raw-sql--truncate). This is because Prisma Client will **not** perform runtime checks on raw queries. - -### Prisma ORM 2.x default referential actions - -Below are the default referential actions written to the database foreign keys when using Prisma Migrate versions 2.x: - -| Clause | Optional relations | Mandatory relations | -| :--------- | :----------------- | :------------------ | -| `onDelete` | `SetNull` | `Cascade` | -| `onUpdate` | `Cascade` | `Cascade` | - -On top of the database referential actions, the following actions are enforced in Prisma Client versions 2.x: - -| Clause | Optional relations | Mandatory relations | -| :--------- | :----------------- | :------------------ | -| `onDelete` | `SetNull` | `Restrict` | -| `onUpdate` | `Cascade` | `Cascade` | - -## Upgrade paths - -There are a couple of paths you can take when upgrading which will give different results depending on the desired outcome. - -If you currently use the migration workflow, you can run `prisma db pull` to check how the defaults are reflected in your schema. You can then manually update your database if you need to. - -You can also decide to skip checking the defaults and run a migration to update your database with the new default values. - -### Using Introspection - -If you [Introspect](/orm/prisma-schema/introspection) your database, the referential actions configured at the database level will be reflected in your Prisma Schema. If you have been using Prisma Migrate or `prisma db push` to manage the database schema, these are likely to be the [\<=2.25.0 default values](#prisma-orm-2x-default-referential-actions). - -When you run an Introspection, Prisma ORM compares all the foreign keys in the database with the schema, if the SQL statements `ON DELETE` and `ON UPDATE` do **not** match the default values, they will be explicitly set in the schema file. - -After introspecting, you can review the non-default clauses in your schema. The most important clause to review is `onDelete`, which defaults to `Cascade` in version 2.25.0 and earlier. - - - -If you are using either the [`delete()`](/orm/prisma-client/queries/crud#delete-a-single-record) or [`deleteAll()`](/orm/prisma-client/queries/crud#delete-all-records) methods, **cascading deletes will now be performed, as the safety net in Prisma Client that previously prevented cascading deletes at runtime is removed**. Be sure to check your code and make any adjustments accordingly. - - - -Make sure you are happy with every case of `onDelete: Cascade` in your schema. If not, either: - -- Modify your Prisma schema and `db push` or `dev migrate` to change the database _or_ -- Manually update the underlying database if you only use `prisma db pull` in your workflow - -The following example would result in a cascading delete, meaning that if the `User` is deleted then all of their `Post`'s will be deleted too. - -#### A blog schema example - -```prisma highlight=4;add -model Post { - id Int @id @default(autoincrement()) - title String - //add-next-line - author User @relation(fields: [authorId], references: [id], onDelete: Cascade) - authorId Int -} - -model User { - id Int @id @default(autoincrement()) - posts Post[] -} -``` - -### Using Migration - -When running a [Migration](/orm/prisma-migrate) (or the [`prisma db push`](/orm/prisma-migrate/workflows/prototyping-your-schema) command) the [new defaults](/orm/prisma-schema/data-model/relations/referential-actions#referential-action-defaults) will be applied to your database. - - - -Unlike when you run `prisma db pull` for the first time, the new referential actions clause and property will **not** automatically be added to your Prisma schema by the Prisma VSCode extension. -You will have to manually add them if you wish to use anything other than the new defaults. - - - -Explicitly defining referential actions in your Prisma schema is optional. If you do not explicitly define a referential action for a relation, Prisma ORM uses the [new defaults](/orm/prisma-schema/data-model/relations/referential-actions#referential-action-defaults). - -Note that referential actions can be added on a case by case basis. This means that you can add them to one single relation and leave the rest set to the defaults by not manually specifying anything. - -### Checking for errors - -**Before** upgrading to version 3.0.1 (or versions 2.26.0 and above with the `referentialActions` feature flag enabled), Prisma ORM prevented the deletion of records while using `delete()` or `deleteMany()` to preserve referential integrity. A custom runtime error would be thrown by Prisma Client with the error code `P2014`. - -**After** upgrading, Prisma ORM no longer performs runtime checks. You can instead specify a custom referential action to preserve the referential integrity between relations. - -When you use [`NoAction`](/orm/prisma-schema/data-model/relations/referential-actions#noaction) or [`Restrict`](/orm/prisma-schema/data-model/relations/referential-actions#restrict) to prevent the deletion of records, the error messages will be different in versions 3.0.1 and above (or 2.26.0 with the `referentialActions` feature flag enabled) compared to versions prior to that. This is because they are now triggered by the database and **not** Prisma Client. The new error code that can be expected is `P2003`, so you should check your code to make adjustments accordingly. - -#### Example of catching errors - -The following example uses the below blog schema with a 1-m relationship between `Post` and `User` and sets a [`Restrict`](/orm/prisma-schema/data-model/relations/referential-actions#restrict) referential actions on the `author` field. - -This means that if a user has a post, that user (and their posts) **cannot** be deleted. - -```prisma file=schema.prisma showLineNumbers -model Post { - id Int @id @default(autoincrement()) - title String - author User @relation(fields: [authorId], references: [id], onDelete: Restrict) - authorId String -} - -model User { - id Int @id @default(autoincrement()) - posts Post[] -} -``` - -Prior to upgrading, the error code you would receive when trying to delete a user which has posts would be `P2014` and it's message: - -> "The change you are trying to make would violate the required relation '\{relation_name}' between the \{model_a_name} and \{model_b_name} models." - -```ts -import { PrismaClient } from '@prisma/client' - -const prisma = new PrismaClient() - -async function main() { - try { - await prisma.user.delete({ - where: { - id: 'some-long-id', - }, - }) - } catch (error) { - if (error instanceof Prisma.PrismaClientKnownRequestError) { - if (error.code === 'P2014') { - console.log(error.message) - } - } - } -} - -main() - .then(async () => { - await prisma.$disconnect() - }) - .catch(async (e) => { - console.error(e) - await prisma.$disconnect() - process.exit(1) - }) -``` - -To make sure you are checking for the correct errors in your code, modify your check to look for `P2003`, which will deliver the message: - -> "Foreign key constraint failed on the field: \{field_name}" - -```ts highlight=14;delete|15;add -import { PrismaClient } from '@prisma/client' - -const prisma = new PrismaClient() - -async function main() { - try { - await prisma.user.delete({ - where: { - id: 'some-long-id' - } - }) - } catch (error) { - if (error instanceof Prisma.PrismaClientKnownRequestError) { - //delete-next-line - if (error.code === 'P2014') { - //add-next-line - if (error.code === 'P2003') { - console.log(error.message) - } - } - } -} - -main() - .then(async () => { - await prisma.$disconnect() - }) - .catch(async (e) => { - console.error(e) - await prisma.$disconnect() - process.exit(1) - }) -``` diff --git a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/index.mdx b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/index.mdx deleted file mode 100644 index 2180704600..0000000000 --- a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/index.mdx +++ /dev/null @@ -1,161 +0,0 @@ ---- -title: 'Upgrade to Prisma ORM 3' -metaTitle: 'Upgrade to Prisma ORM 3' -metaDescription: 'Guides on how to upgrade to Prisma ORM 3' -tocDepth: 3 -toc: true ---- - - - -Prisma ORM 3 introduces a number of **breaking changes** if you are upgrading from an earlier version (any 2.x version), therefore, it is important to understand how this upgrade might affect your application and make any needed adjustments to ensure a smooth transition. - -Below you will find a list of the breaking changes and how to handle them. - - - -## Breaking changes - -### [Referential actions](/orm/prisma-schema/data-model/relations/referential-actions) - -The introduction of referential actions in version 3.x removes the safety net in Prisma Client that had previously prevented cascading deletes at runtime. - -As a result, depending on which workflow you are using to work on your application, you could be impacted. We advise you to check your schema and decide if you need to define referential actions explicitly. - -See [Referential action upgrade path](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/referential-actions) to understand how to proceed. - -### [Named constraints](/orm/prisma-schema/data-model/database-mapping) - -We changed the convention followed by Prisma ORM to name constraints and indexes. We also introduced a clear distinction between the `map` attribute (database-level name) and `name` attribute (Prisma Client API name) in the PSL to explicitly control how constraints are defined in the Prisma schema. - -This means that you will notice an impact when running Prisma `migrate` or `db pull` which will follow this new convention. We advise you to adjust your schema to reflect the names of your constraints and indexes appropriately. - -You can check out the [Named constraints upgrade path](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/named-constraints) for more information on how to proceed. - -### [$queryRaw](/orm/prisma-client/using-raw-sql/raw-queries) - -From version 3.x onwards, the `$queryRaw` method now only supports a template literal. - -This means that if your application relied on `$queryRaw` calls using _strings_, those calls will **not** work anymore. We advise you to use template literals wherever possible for security reasons or resort to `$queryRawUnsafe` otherwise, after carefully escaping queries to prevent SQL injections. - -You can learn more about the new `$queryRaw` and `$queryRawUnsafe` methods in the [Raw database access](/orm/prisma-client/using-raw-sql/raw-queries) section of the docs. - -### [Json Null Equality](/orm/prisma-client/special-fields-and-types/working-with-json-fields#filtering-by-null-values) - -You cannot filter a `Json` field by a null value. [See this GitHub issue](https://github.com/prisma/prisma/issues/8399). -This is because `{ equals: null }` checks if the column value in the database is `NULL`, not if the JSON value inside the column equals `null`. - -To fix this problem, we decided to split null on Json fields into `JsonNull`, `DbNull` and `AnyNull`. - -- **JsonNull**: Selects the null value in JSON. -- **DbNull**: Selects the NULL value in the database. -- **AnyNull:** Selects both null JSON values and NULL database values. - -Given the following model in your Prisma Schema: - -```ts -model Log { - id Int @id - meta Json -} -``` - -Starting in 3.0.1, you'll see a TypeError if you try to filter by null on a `Json` field: - -```ts -prisma.log.findMany({ - where: { - data: { - meta: { - equals: null - ^ TypeError: Type 'null' is not assignable to type - } - }, - }, -}); -``` - -To fix this, you'll import and use one of the new null types: - -```ts highlight=7;normal -import { Prisma } from '@prisma/client' - -prisma.log.findMany({ - where: { - data: { - meta: { - equals: Prisma.AnyNull, - }, - }, - }, -}) -``` - -This also applies to `create`, `update` and `upsert`. To insert a `null` value -into a `Json` field, you would write: - -```ts highlight=5;normal -import { Prisma } from '@prisma/client' - -prisma.log.create({ - data: { - meta: Prisma.JsonNull, - }, -}) -``` - -And to insert a database `NULL` into a Json field, you would write: - -```ts highlight=5;normal -import { Prisma } from '@prisma/client' - -prisma.log.create({ - data: { - meta: Prisma.DbNull, - }, -}) -``` - - - -This API change does not apply to the MongoDB connector where there is not a difference between a JSON null and a database NULL. - -They also do not apply to the `array_contains` operator because there can only be a JSON null within an JSON array. Since there cannot be a database NULL within a JSON array, `{ array_contains: null }` is not ambiguous. - - - -## Specific upgrade paths - - - -## Upgrading the `prisma` and `@prisma/client` packages to Prisma ORM 3 - -To upgrade from version 2.x to 3.x, you need to update both the `prisma` and `@prisma/client` packages. Both the `prisma` and `@prisma/client` packages install with a caret `^` in their version number to safe guard against breaking changes. - -To ignore the caret `^` and upgrade across major versions, you can use the `@3` tag when upgrading with `npm`, or `yarn` . - - - -Before upgrading, check each **breaking change** to see how the upgrade might affect your application. - - - - - - - -```terminal -npm install prisma@3 @prisma/client@3 -``` - - - - - -```terminal -yarn up prisma@3 @prisma/client@3 -``` - - - - \ No newline at end of file diff --git a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/index.mdx b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/index.mdx index a207ab3508..a56e19dae3 100644 --- a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/index.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/index.mdx @@ -22,16 +22,8 @@ To upgrade to the latest version of Prisma ORM: ## Common upgrade paths -### Prisma ORM 2 and onwards - - [Upgrade to Prisma ORM 6](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-6) - [Upgrade to Prisma ORM 5](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5) -- [Upgrade to Prisma ORM 4](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-4) -- [Upgrade to Prisma ORM 3](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3) - -### Prisma 1 - -- [Upgrade from Prisma 1](/orm/more/upgrade-guides/upgrade-from-prisma-1) ## Testing new features, without upgrading @@ -45,8 +37,8 @@ To install the latest `dev` distribution tag: npm install @prisma/client@dev prisma@dev ``` - +:::danger Do not use the `dev` distribution tag in production - wait until the official release that contains the features and fixes you are interested in is released. For example, fixes present `@prisma/client@2.23.0-dev.25` will eventually be released as part of `@prisma/client@2.23.0`. - +::: diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/01-how-to-upgrade.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/01-how-to-upgrade.mdx deleted file mode 100644 index 463a1f141b..0000000000 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/01-how-to-upgrade.mdx +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: 'How to upgrade' -metaTitle: 'How to upgrade from Prisma 1 to Prisma ORM version 2.x and later' -metaDescription: 'Learn how to upgrade your Prisma 1 project to Prisma ORM version 2.x and later' ---- - -## Overview - -This page helps you make an informed decision on when and how to upgrade from Prisma 1 to Prisma ORM version 2._x_ and later. - -## Upgrade documentation - -The upgrade documentation consists of several pages, here's an overview of how to use them: - -- **How to upgrade** (_you are here_): Starting point to learn about the upgrade process in general. -- [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql): A _reference_ page about the schema incompatibilities between Prisma 1 and Prisma ORM 2._x_ (and later versions). Reading this page is optional but it will give you a better understanding of certain steps in the upgrade process. - -In addition to these two pages, there are various _practical guides_ that walk you through an example scenario of the upgrade process: - -- [Upgrading the Prisma layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql): No matter what your Prisma 1 setup looks like, you should **always start your upgrade process by following this guide**. - -Once you're done with that guide, you can choose **one of the following four guides to upgrade your application layer**: - -- [Old to new Nexus](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus): Choose this guide if you're currently running Prisma 1 with GraphQL Nexus. -- [prisma-binding to Nexus](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-nexus): Choose this guide if you're currently running Prisma 1 with `prisma-binding` and want to upgrade to [Nexus](https://nexusjs.org/). -- [prisma-binding to SDL-first](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-sdl-first): Choose this guide if you're currently running Prisma 1 with `prisma-binding` and want to upgrade to an [SDL-first](https://www.prisma.io/blog/the-problems-of-schema-first-graphql-development-x1mn4cb0tyl3) GraphQL server. -- [REST API](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-a-rest-api): Choose this guide if you're currently running Prisma 1 using Prisma Client 1 and are building a REST API. - -## Main differences between Prisma 1 and Prisma ORM version 2._x_ and later - -On a high-level, the biggest differences between Prisma 1 and Prisma ORM versions 2._x_ and later are summarized below. - -Prisma ORM 2._x_ and later versions: - -- don't require hosting a database proxy server (i.e., the [Prisma server](https://v1.prisma.io/docs/1.34/prisma-server/)). -- make the features of Prisma 1 more modular and splits them into dedicated tools: - - Prisma Client: An improved version of Prisma Client 1.0 - - Prisma Migrate: Data modeling and migrations (formerly `prisma deploy`). -- use the [Prisma schema](/orm/prisma-schema), a merge of Prisma 1 datamodel and `prisma.yml`. -- use its own [modeling language](https://github.com/prisma/specs/tree/master/schema) instead of being based on GraphQL SDL. -- don't expose ["a GraphQL API for your database"](https://www.prisma.io/blog/prisma-and-graphql-mfl5y2r7t49c) anymore, but only allows for _programmatic access_ via the Prisma Client API. - - don't support Prisma ORM binding any more. -- allows connecting Prisma ORM 2._x_ and later version to any existing database, via more powerful introspection - -## Feature parity - -Prisma ORM 2._x_ and later versions do not yet have full feature parity with Prisma 1. The biggest feature that is still missing from Prisma ORM versions 2._x_ and later is real-time subscriptions. - -- **Real-time API (Subscriptions)**: Prisma ORM version 2._x_ and later currently [doesn't have a way to subscribe to events happening in the database](https://github.com/prisma/prisma/issues/298) and get notified in real time. It is currently unclear if, when, and in what form a real-time API will be added to Prisma ORM versions 2._x_ and later. For the time being, you can implement real-time functionality using native database triggers, or if you're using GraphQL subscriptions you can consider triggering subscriptions manually inside your _mutation resolvers_. - -## Schema incompatibilities - -The database schema that is created when running `prisma deploy` in Prisma 1 is only partially compatible with the one that Prisma ORM versions 2._x_ and later creates. This section gives a quick overview of the general incompatibilities and the potential workarounds. - - -> **Note**: For a detailed explanation of the problems and respective workarounds, please refer to the [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) page. - -Here's an overview of the different columns: - -- **Problem**: A short description of the problem when upgrading from Prisma 1 to Prisma ORM versions 2._x_ and later -- **SQL**: Can this be solved by making a non-breaking change to the SQL schema? -- **Prisma schema**: Can this be solved by making a non-breaking change to the schema in Prisma ORM versions 2._x_ and later? -- **Breaking Prisma 1**: Do the SQL statements break the Prisma 1 setup? This is only relevant when you're choosing the gradual side-by-side [upgrade strategy](#upgrade-strategies). - -| Problem | SQL | Prisma schema | Breaking Prisma 1 | -| ------------------------------------------------------------------------ | ------- | ------------- | ---------------------------------- | -| Default values aren't represented in database | Yes | Yes | No | -| Generated CUIDs as ID values aren't represented in database | No | Yes | No | -| `@createdAt` isn't represented in database | Yes | Yes | No | -| `@updatedAt` isn't represented in database | No | Yes | No | -| Inline 1-1 relations are recognized as 1-n (missing `UNIQUE` constraint) | Yes | No | No | -| _All_ non-inline relations are recognized as m-n | Yes | No | Yes | -| Json type is represented as `TEXT` in database | Yes | No | No (MySQL)
Yes (PostgreSQL) | -| Enums are represented as `TEXT` in database | Yes | No | No (MySQL)
Yes (PostgreSQL) | -| Required 1-1 relations are not represented in database | No | Yes | No | -| `@db` attributes from Prisma 1 are not transferred to the Prisma schema | No | Yes | No | -| Mismatching CUID length | Yes | No | No | -| Scalar lists (arrays) are maintained with extra table | Depends | No | Depends | - -> **Note**: A general drawback with the workarounds in the Prisma schema is that [changes to the Prisma schema get lost after re-introspecting the database](https://github.com/prisma/prisma/issues/2425) and need to be re-added manually after each introspection run. - -## Prisma 1 Upgrade CLI - -The [Prisma 1 Upgrade CLI](https://github.com/prisma/prisma1-upgrade) helps you apply the workarounds that are explained on the [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) page. It generates the SQL statements to fix the database schema and make it compatible with Prisma ORM versions 2._x_ and later. Note that you are in full control over the operations that are executed against your database, the Upgrade CLI only generates and prints the statements for you. The Upgrade CLI also takes care of the workarounds in the Prisma schema. - -On a high-level, the upgrade workflow using the Upgrade CLI looks as follows. - -For the **initial setup**: - -1. You set up Prisma ORM by installing the Prisma ORM versions 2._x_ and later CLI and running `npx prisma init`. -1. You connect to your database and introspect it with `npx prisma db pull`. - -![Prisma CLI introspection flow](./images/prisma-cli-introspection-flow.png) - -For **fixing the schema incompatibilities**: - -1. You invoke the Upgrade CLI with `npx prisma-upgrade`. -1. The Upgrade CLI generates SQL commands for you to run on your database. -1. You run the SQL commands against your database. -1. You run the `prisma db pull` command again. -1. You run the `npx prisma-upgrade` command again. -1. The Upgrade CLI adjusts the Prisma schema (version 2._x_ and later) by adding missing attributes. - -![Fixing the schema incompatibilities](./images/fix-schema-incompatibilities.png) - -Note that the Upgrade CLI is designed in a way that **you can stop and re-start the process at any time**. Once you ran a SQL command that was generated by the Upgrade CLI against your database, the SQL command will not show up the next time you invoke the Upgrade CLI. That way, you can gradually resolve all schema incompatibilities when it's convenient for you. - -## Upgrade strategies - -There are two main upgrade strategies: - -- **Upgrade all at once**: Entirely remove Prisma 1 from your project and move everything over to Prisma ORM version 2._x_ or later at once. -- **Gradual upgrade side-by-side**: Add Prisma ORM version 2._x_ and later to the existing Prisma 1 project and gradually replace existing Prisma 1 features with the newer Prisma features while running them side-by-side. - -Note that if you are planning to run Prisma 1 and Prisma ORM 2._x_ or later version side-by-side, you must not yet resolve the [schema compatibilities](#schema-incompatibilities) that are breaking the Prisma 1 setup. - -### When to choose which strategy - -If your project is not yet running in production or has little traffic and user data, the **all at once** strategy is recommended. - -In case your project already sees a lot of traffic and has a lot of user data stored in the database, you might want to consider the **gradual** upgrade strategy where you're running Prisma 1 and Prisma ORM 2 or later side-by-side for a certain amount of time until you've replace all former Prisma 1 functionality with Prisma ORM 2 or later version. - -Note that you won't be able to fix the [schema incompatibilities](#schema-incompatibilities) that require a "Breaking Prisma 1" change if you choose the gradual upgrade strategy and intend to run Prisma 1 and Prisma ORM version 2._x_ or later side-by-side. That's because these data migrations are breaking the schema that Prisma 1 expects. This means that your Prisma Client API might not feel as idiomatic as it could, but you still get the full feature set of Prisma Client. - -### Upgrade path - -No matter which of the strategies you choose, on a high-level the envisioned upgrade path looks as follows: - -1. Install the new Prisma ORM version 2._x_ or later CLI as a development dependency -1. Create your Prisma schema and configure the database connection URL -1. Use the Prisma ORM version 2._x_ or later CLI to introspect your Prisma 1 database and generate your Prisma schema -1. Run the [Prisma 1 Upgrade CLI](https://github.com/prisma/prisma1-upgrade) to "fix" the Prisma schema -1. Install and generate Prisma Client version 2._x_ or later -1. Adjust your application code, specifically replace the API calls from the Prisma Client 1.0 with those of Prisma Client version 2._x_ or later - -## Next steps - -Once you've made the decision to upgrade, continue with the [Upgrading the Prisma ORM layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql) guide. diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities-mysql.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities-mysql.mdx deleted file mode 100644 index 80dab5f158..0000000000 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities-mysql.mdx +++ /dev/null @@ -1,776 +0,0 @@ ---- -title: 'Schema incompatibilities' -metaTitle: 'Schema Incompatibilities | MySQL' -metaDescription: 'Problems and workarounds for Prisma 1 and 2.0 schemas with MySQL' -dbSwitcher: ['postgresql', 'mysql'] -sidebar_class_name: hidden-sidebar -pagination_next: orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-mysql -slugSwitch: /orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities- ---- - -## Overview - -Each section on this page describes a potential problem when upgrading from Prisma 1 to Prisma ORM 2._x_ and later and explains the available workarounds. - -## Default values aren't represented in database - -### Problem - -When adding the `@default` directive in a Prisma 1 datamodel, the default values for this field are generated by the Prisma 1 server at runtime. There's no `DEFAULT` constraint added to the database column. Because this constraint is not reflected in the database itself, the Prisma ORM 2._x_ and later versions of introspection can't recognize it. - -### Example - -#### Prisma 1 datamodel - -```graphql -type Post { - id: ID! @id - published: Boolean @default(value: false) -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "Post" ( - id VARCHAR(25) PRIMARY KEY NOT NULL, - published BOOLEAN NOT NULL -); -``` - -#### Result of introspection in Prisma ORM versions 2._x_ and later - -```prisma file=schema.prisma showLineNumbers -model Post { - id String @id - published Boolean -} -``` - -Because the `DEFAULT` constraint has not been added to the database when mapping the Prisma 1 datamodel to the database with `prisma deploy`, Prisma ORM v2 (and later versions) doesn't recognize it during introspection. - -### Workarounds - -#### Manually add a `DEFAULT` constraint to the database column - -You can alter the column to add the `DEFAULT` constraint as follows: - -```sql -ALTER TABLE `Post` - ALTER COLUMN published SET DEFAULT false; -``` - -After this adjustment, you can re-introspect your database and the `@default` attribute will be added to the `published` field: - -```prisma line-number file=schema.prisma highlight=3;normal showLineNumbers -model Post { - id String @id - //highlight-next-line - published Boolean @default(false) -} -``` - -#### Manually add a `@default` attribute to the Prisma model - -You can add the `@default` attribute to the Prisma model: - -```prisma line-number file=schema.prisma highlight=3;add showLineNumbers -model Post { - id String - //add-next-line - published Boolean @default(false) -} -``` - -If the `@default` attribute is set in the Prisma schema and you run `prisma generate`, the resulting Prisma Client code will generate the specified default values at runtime (similar to what the Prisma 1 server did in Prisma 1). - -## Generated CUIDs as ID values aren't represented in database - -### Problem - -Prisma 1 auto-generates ID values as CUIDs for `ID` fields when they're annotated with the `@id` directive. These CUIDs are generated by the Prisma 1 server at runtime. Because this behavior is not reflected in the database itself, the introspection in Prisma ORM 2._x_ and later can't recognize it. - -### Example - -#### Prisma 1 datamodel - -```graphql -type Post { - id: ID! @id -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "Post" ( - id VARCHAR(25) PRIMARY KEY NOT NULL -); -``` - -#### Result of introspection in Prisma ORM versions 2._x_ and later - -```prisma file=schema.prisma showLineNumbers -model Post { - id String @id -} -``` - -Because there's no indication of the CUID behavior in the database, Prisma ORM's introspection doesn't recognize it. - -### Workaround - -As a workaround, you can manually add the `@default(cuid())` attribute to the Prisma model: - -```prisma line-number file=schema.prisma highlight=2;add showLineNumbers -model Post { - //add-next-line - id String @id @default(cuid()) -} -``` - -If the `@default` attribute is set in the Prisma schema and you run `prisma generate`, the resulting Prisma Client code will generate the specified default values at runtime (similar to what the Prisma 1 server did in Prisma 1). - -Note that you'll have to re-add the attribute after each introspection because introspection removes it (as the previous version of the Prisma schema is overwritten)! - -## `@createdAt` isn't represented in database - -### Problem - -Prisma 1 auto-generates values for `DateTime` fields when they're annotated with the `@createdAt` directive. These values are generated by the Prisma 1 server at runtime. Because this behavior is not reflected in the database itself, the introspection in Prisma ORM 2._x_ and later can't recognize it. - -### Example - -#### Prisma 1 datamodel - -```graphql line-number highlight=3;normal -type Post { - id: ID! @id - createdAt: DateTime! @createdAt -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "Post" ( - id VARCHAR(25) PRIMARY KEY NOT NULL, - "createdAt" TIMESTAMP NOT NULL -); -``` - -#### Result of introspection in Prisma ORM 2._x_ and later versions - -```prisma file=schema.prisma showLineNumbers -model Post { - id String @id - createdAt DateTime -} -``` - -### Workarounds - -#### Manually add `DEFAULT CURRENT_TIMESTAMP` to the database column - -You can alter the column to add the `DEFAULT` constraint as follows: - -```sql -ALTER TABLE "Post" - ALTER COLUMN "createdAt" SET DEFAULT CURRENT_TIMESTAMP; -``` - -After this adjustment, you can re-introspect your database and the `@default` attribute will be added to the `createdAt` field: - -```prisma file=schema.prisma showLineNumbers -model Post { - id String - createdAt DateTime @default(now()) -} -``` - -#### Manually add the `@default(now())` attribute to the Prisma model - -As a workaround, you can manually add the `@default(now())` attribute to the Prisma model: - -```prisma line-number file=schema.prisma highlight=3;normal showLineNumbers -model Post { - id String @id - //highlight-next-line - createdAt DateTime @default(now()) -} -``` - -If the `@default` attribute is set in the Prisma schema and you run `prisma generate`, the resulting Prisma Client code will generate the specified default values at runtime (similar to what the Prisma 1 server did in Prisma 1). - -Note that you'll have to re-add the attribute after each introspection because introspection removes it (as the previous version of the Prisma schema is overwritten)! - -## `@updatedAt` isn't represented in database - -### Problem - -Prisma 1 auto-generates values for `DateTime` fields when they're annotated with the `@updatedAt` directive. These values are generated by the Prisma 1 server at runtime. Because this behavior is not reflected in the database itself, the introspection in Prisma ORM 2._x_ and later can't recognize it.. - -### Example - -#### Prisma 1 datamodel - -```graphql -type Post { - id: ID! @id - updatedAt: DateTime! @updatedAt -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "Post" ( - id VARCHAR(25) PRIMARY KEY NOT NULL, - updatedAt TIMESTAMP -); -``` - -#### Result of introspection in Prisma ORM 2._x_ and later versions - -```prisma file=schema.prisma showLineNumbers -model Post { - id String @id - updatedAt DateTime -} -``` - -### Workarounds - -#### Manually add the `@updatedAt` attribute to the Prisma model - -As a workaround, you can manually add the `@updatedAt` attribute to the Prisma model: - -```prisma line-number file=schema.prisma highlight=3;add showLineNumbers -model Post { - id String @id - //add-next-line - updatedAt DateTime @updatedAt -} -``` - -If the `@updatedAt` attribute is set in the Prisma schema and you run `prisma generate`, the resulting Prisma Client code will automatically generate values for this column when an existing record is updated (similar to what the Prisma 1 server did in Prisma 1). - -Note that you'll have to re-add the attribute after each introspection because introspection removes it (as the previous version of the Prisma schema is overwritten)! - -## Inline 1-1 relations are recognized as 1-n (missing `UNIQUE` constraint) - -### Problem - -In the [datamodel v1.1](https://www.prisma.io/blog/datamodel-v11-lrzqy1f56c90) that was introduced in Prisma ORM v1.31, 1-1 relations can be declared as _inline_. In that case, the relation will not be maintained via a [relation table](/orm/prisma-schema/data-model/relations/many-to-many-relations#relation-tables) but via a single foreign key on one of the two tables involved. - -When this approach is used, Prisma ORM doesn't add a `UNIQUE` constraint to the foreign key column which means that after introspection in Prisma ORM version 2._x_ and later, this former 1-1 relation will be added as a 1-n relation to the Prisma schema. - -### Example - -#### Prisma ORM datamodel v1.1 (available from Prisma ORM v1.31) - -```graphql -type User { - id: ID! @id - profile: Profile @relation(link: INLINE) -} - -type Profile { - id: ID! @id - user: User -} -``` - -Note that omitting the `@relation` directive in this case would result in the same behavior because `link: INLINE` is the _default_ for 1-1 relations. - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "User" ( - id VARCHAR(25) PRIMARY KEY NOT NULL -); - -CREATE TABLE "Profile" ( - id VARCHAR(25) PRIMARY KEY NOT NULL, - "user" VARCHAR(25), - FOREIGN KEY ("user") REFERENCES "User"(id) -); -``` - -#### Result of introspection in Prisma ORM 2._x_ and later versions - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id - Profile Profile[] -} - -model Profile { - id String @id - user String? - User User? @relation(fields: [user], references: [id]) -} -``` - -Because there's no `UNIQUE` constraint defined on the `user` column (which represents the foreign key in this relation), Prisma ORM's introspection recognizes the relation as 1-n. - -### Workaround - -#### Manually add `UNIQUE` constraint to the foreign key column - -You can alter the foreign key column to add the `UNIQUE` constraint as follows: - -```sql -ALTER TABLE `Profile` - ADD CONSTRAINT userId_unique UNIQUE (`user`); -``` - -After this adjustment, you can re-introspect your database and the 1-1 relation will be properly recognized: - -```prisma line-number file=schema.prisma highlight=3;normal showLineNumbers -model User { - id String @id - //highlight-next-line - Profile Profile? -} - -model Profile { - id String @id - user String? @unique - User User? @relation(fields: [user], references: [id]) -} -``` - -## _All_ non-inline relations are recognized as m-n - -### Problem - -Prisma 1 represents relations as relation tables most of the time: - -- All relations in the Prisma 1 **datamodel v1.0** are represented as relation tables -- In **datamodel v1.1**, all m-n relations as well as the 1-1 and 1-n relations declared as `link: TABLE` are represented as relation tables. - -Because of this representation, introspection in Prisma ORM version 2._x_ and later will recognize all these relations as m-n relations, even though they might have been declared as 1-1 or 1-n in Prisma 1. - -### Example - -#### Prisma 1 datamodel - -```graphql -type User { - id: ID! @id - posts: [Post!]! -} - -type Post { - id: ID! @id - author: User! @relation(link: TABLE) -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "User" ( - id VARCHAR(25) PRIMARY KEY NOT NULL -); - -CREATE TABLE "Post" ( - id VARCHAR(25) PRIMARY KEY NOT NULL -); - -CREATE TABLE "_PostToUser" ( - "A" VARCHAR(25) NOT NULL REFERENCES "Post"(id) ON DELETE CASCADE, - "B" VARCHAR(25) NOT NULL REFERENCES "User"(id) ON DELETE CASCADE -); -CREATE UNIQUE INDEX "_PostToUser_AB_unique" ON "_PostToUser"("A" text_ops,"B" text_ops); -CREATE INDEX "_PostToUser_B" ON "_PostToUser"("B" text_ops); -``` - -#### Result of introspection in Prisma ORM 2._x_ and later versions - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id - Post Post[] @relation(references: [id]) -} - -model Post { - id String @id - User User[] @relation(references: [id]) -} -``` - -Because the relation table that was created by Prisma 1 uses the same [conventions for relation tables](/orm/prisma-schema/data-model/relations/many-to-many-relations#conventions-for-relation-tables-in-implicit-m-n-relations) as in Prisma ORM version 2._x_ and later, the relation now gets recognized as a m-n relation. - -### Workaround - -As a workaround, you can migrate the data into a structure that's compatible with Prisma ORM's 1-n relation: - -1. Create new column `authorId` on the `Post` table. This column should be a _foreign key_ that references the `id` field of the `User` table: - ```sql - ALTER TABLE `Post` ADD COLUMN `authorId` VARCHAR(25); - ALTER TABLE `Post` ADD FOREIGN KEY (`authorId`) REFERENCES `User` (`id`); - ``` -1. Write a SQL query that reads all the rows from the `_PostToUser` relation table and for each row: - 1. Finds the respective `Post` record by looking up the value from column `A` - 1. Inserts the value from column `B` as the value for `authorId` into that `Post` record - ```sql - UPDATE Post, _PostToUser - SET Post.authorId = _PostToUser.B - WHERE Post.id = _PostToUser.A - ``` -1. Delete the `_PostToUser` relation table - ```sql - DROP TABLE `_PostToUser`; - ``` - -After that you can introspect your database and the relation will now be recognized as 1-n: - -```prisma line-number file=schema.prisma highlight=3,8,9;normal showLineNumbers -model User { - id String @id - //highlight-next-line - Post Post[] -} - -model Post { - id String @id - //highlight-start - User User @relation(fields: [authorId], references: [id]) - authorId String - //highlight-end -} -``` - -## `Json` type is represented as `TEXT` in database - -### Problem - -Prisma 1 supports the `Json` data type in its datamodel. However, in the underlying database, fields of type `Json` are actually stored as plain strings using the `TEXT` data type of the underlying database. Any parsing and validation of the stored JSON data is done by the Prisma 1 server at runtime. - -### Example - -#### Prisma 1 datamodel - -```graphql -type User { - id: ID! @id - jsonData: Json -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "User" ( - id VARCHAR(25) PRIMARY KEY NOT NULL, - jsonData TEXT -); -``` - -#### Result of introspection in Prisma ORM 2._x_ and later versions - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id - jsonData String? -} -``` - -### Workaround - -You can manually change the type of the column to `JSON` - -```sql -ALTER TABLE User MODIFY COLUMN jsonData JSON; -``` - -After this adjustment, you can re-introspect your database and the field will now be recognized as `Json`: - -```prisma line-number file=schema.prisma highlight=3;normal showLineNumbers -model User { - id String @id - //highlight-next-line - jsonData Json? -} -``` - -## Enums are represented as `TEXT` in database - -### Problem - -Prisma 1 supports the `enum` data type in its datamodel. However, in the underlying database, types declared as `enum` are actually stored as plain strings using the `TEXT` data type of the underlying database. Any validation of the stored `enum` data is done by the Prisma 1 server at runtime. - -### Example - -#### Prisma 1 datamodel - -```graphql -type User { - id: ID! @id - role: Role -} - -enum Role { - ADMIN - CUSTOMER -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "User" ( - id VARCHAR(25) PRIMARY KEY NOT NULL, - role TEXT -); -``` - -#### Result of introspection in Prisma ORM 2._x_ and later versions - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id - role String? -} -``` - -### Workaround - -You can manually turn the `role` column into an enum with your desired values: - -1. Create an `enum` in your database that mirrors the `enum` you defined in the Prisma 1 datamodel: - ```sql - CREATE TYPE "Role" AS ENUM ('CUSTOMER', 'ADMIN'); - ``` -1. Change the type from `TEXT` to your new `enum`: - ```sql - ALTER TABLE "User" ALTER COLUMN "role" TYPE "Role" - USING "role"::text::"Role"; - ``` - -After introspection, the type is now properly recognized as an enum: - -```prisma line-number file=schema.prisma highlight=3,6-9;normal showLineNumbers -model User { - id String @id - //highlight-next-line - role Role? -} - -//highlight-start -enum Role { - ADMIN - CUSTOMER -} -//highlight-end -``` - -## Mismatching CUID length - -### Problem - -Prisma 1 uses CUIDs as ID values for all database records. In the underlying database, these IDs are represented as strings with a maximum size of 25 characters (as `VARCHAR(25)`). However, when configuring default CUIDs in your Prisma ORM 2._x_ (or later versions) schema with `@default(cuid())` the generated ID values might exceed the limit of 25 characters (the maximum length might be 30 characters). To make your IDs proof for Prisma ORM 2._x_ (or later versions), you therefore need to adjust the column type to `VARCHAR(30)`. - -### Example - -#### Prisma 1 datamodel - -```graphql -type User { - id: ID! @id -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "User" ( - id VARCHAR(25) PRIMARY KEY NOT NULL -); -``` - -#### Result of introspection in Prisma ORM 2._x_ and later versions - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id -} -``` - -### Workaround - -You can manually turn the `VARCHAR(25)` columns into `VARCHAR(30)`: - -```sql -SET FOREIGN_KEY_CHECKS=0; -ALTER TABLE `User` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; -SET FOREIGN_KEY_CHECKS=1; -``` - -> **Note**: When fixing this issue with the [Upgrade CLI](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#prisma-1-upgrade-cli), the generated SQL statements will keep appearing in the Upgrade CLI even after you have changed the column types in the underlying database. This is a currently a limitation in the Upgrade CLI. - -## Scalar lists (arrays) are maintained with extra table - -### Problem - -In Prisma 1, you can define lists of _scalar_ types on your models. Under the hood, this is implemented with an extra table that keeps track of the values in the list. - -To remove the approach with the extra table which incurred hidden performance costs, Prisma ORM 2._x_ and later versions only support scalar lists only when they're natively supported by the database you use. At the moment, only [PostgreSQL supports scalar lists (arrays) natively](https://www.postgresql.org/docs/9.1/arrays.html). - -With PostgreSQL, you therefore can keep using scalar lists in Prisma ORM 2._x_ and later versions, but you'll need to perform a data migration to transfer the data from the extra table from Prisma 1 into an actual PostgreSQL array. - -### Example - -#### Prisma 1 datamodel - -```graphql -type User { - id: ID! @id - coinflips: [Boolean!]! @scalarList(strategy: RELATION) -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "User" ( - id VARCHAR(25) PRIMARY KEY NOT NULL -); - -CREATE TABLE "User_coinflips" ( - "nodeId" VARCHAR(25) REFERENCES "User"(id), - position INTEGER, - value BOOLEAN NOT NULL, - CONSTRAINT "User_coinflips_pkey" PRIMARY KEY ("nodeId", position) -); -CREATE UNIQUE INDEX "User_coinflips_pkey" ON "User_coinflips"("nodeId" text_ops,position int4_ops); -``` - -#### Result of Prisma ORM 2 introspection - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id - User_coinflips User_coinflips[] -} - -model User_coinflips { - nodeId String - position Int - value Boolean - User User @relation(fields: [nodeId], references: [id]) - - @@id([nodeId, position]) -} -``` - -Note that you can now generate Prisma Client and you'll be able to access the data from the scalar lists through the extra table. PostgreSQL users can alternatively migrate the data into a native PostgreSQL array and continue to benefit from the slicker Prisma Client API for scalar lists (read the section below for more info). - -
- -Expand for sample Prisma Client API calls - -To access the coinflips data, you will now have to always [`include`](/orm/prisma-client/queries/select-fields#return-nested-objects-by-selecting-relation-fields) it in your queries: - -```ts -const user = await prisma.user.findUnique({ - where: { id: 1 }, - include: { - coinflips: { - orderBy: { position: 'asc' }, - }, - }, -}) -``` - -> **Note**: The `orderBy` is important to retain the order of the list. - -This is the `result of the query: - -```js -{ - id: 1, - name: 'Alice', - coinflips: [ - { id: 1, position: 1000, value: false }, - { id: 2, position: 2000, value: true }, - { id: 3, position: 3000, value: false }, - { id: 4, position: 4000, value: true }, - { id: 5, position: 5000, value: true }, - { id: 6, position: 6000, value: false } - ] -} -``` - -To access just the boolean values from the list, you can `map` over the `coinflips` on `user` as follows: - -```ts -const currentCoinflips = user!.coinflips.map((cf) => cf.value) -``` - -> **Note**: The exclamation mark above means that you're _force unwrapping_ the `user` value. This is necessary because the `user` returned from the previous query might be `null`. - -Here's the value of `currentCoinflips` after the call to `map`: - -```json -[false, true, false, true, true, false] -``` - -
- -### Workaround - -The following workaround is only available for PostgreSQL users! - -As scalar lists (i.e. [arrays](https://www.postgresql.org/docs/9.1/arrays.html)) are available as a native PostgreSQL feature, you can keep using the same notation of `coinflips: Boolean[]` in your Prisma schema. - -However, in order to do so you need to manually migrate the underlying data from the `User_coinflips` table into a PostgreSQL array. Here's how you can do that: - -1. Add the new `coinflips` column to the `User` tables: - ```sql - ALTER TABLE "User" ADD COLUMN coinflips BOOLEAN[]; - ``` -1. Migrate the data from `"User_coinflips".value` to `"User.coinflips"`: - ```sql - UPDATE "User" - SET coinflips = t.flips - FROM ( - SELECT "nodeId", array_agg(VALUE ORDER BY position) AS flips - FROM "User_coinflips" - GROUP BY "nodeId" - ) t - where t."nodeId" = "User"."id"; - ``` -1. To cleanup, you can delete the `User_coinflips` table: - ```sql - DROP TABLE "User_coinflips"; - ``` - -You can now introspect your database and the `coinflips` field will be represented as an array in your new Prisma schema: - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id - coinflips Boolean[] -} -``` - -You can keep using Prisma Client as before: - -```ts -const user = await prisma.user.findUnique({ - where: { id: 1 }, -}) -``` - -This is the result from the API call: - -```js -{ - id: 1, - name: 'Alice', - coinflips: [ false, true, false, true, true, false ] -} -``` diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities-postgresql.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities-postgresql.mdx deleted file mode 100644 index 59ff7030bd..0000000000 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities-postgresql.mdx +++ /dev/null @@ -1,777 +0,0 @@ ---- -title: 'Schema incompatibilities' -metaTitle: 'Schema Incompatibilities | PostgreSQL' -metaDescription: 'Problems and workarounds for Prisma 1 and 2.0 schemas with PostgreSQL' -dbSwitcher: ['postgresql', 'mysql'] -pagination_next: orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql -slugSwitch: /orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities- ---- - -## Overview - -Each section on this page describes a potential problem when upgrading from Prisma 1 to Prisma ORM 2._x_ and later and explains the available workarounds. - -## Default values aren't represented in database - -### Problem - -When adding the `@default` directive in a Prisma 1 datamodel, the default values for this field are generated by the Prisma 1 server at runtime. There's no `DEFAULT` constraint added to the database column. Because this constraint is not reflected in the database itself, the Prisma ORM 2._x_ and later versions of introspection can't recognize it. - -### Example - -#### Prisma 1 datamodel - -```graphql -type Post { - id: ID! @id - published: Boolean @default(value: false) -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "Post" ( - id VARCHAR(25) PRIMARY KEY NOT NULL, - published BOOLEAN NOT NULL -); -``` - -#### Result of introspection in Prisma ORM versions 2._x_ and later - -```prisma file=schema.prisma showLineNumbers -model Post { - id String @id - published Boolean -} -``` - -Because the `DEFAULT` constraint has not been added to the database when mapping the Prisma 1 datamodel to the database with `prisma deploy`, Prisma ORM v2 (and later versions) doesn't recognize it during introspection. - -### Workarounds - -#### Manually add a `DEFAULT` constraint to the database column - -You can alter the column to add the `DEFAULT` constraint as follows: - -```sql -ALTER TABLE "Post" - ALTER COLUMN published SET DEFAULT false; -``` - -After this adjustment, you can re-introspect your database and the `@default` attribute will be added to the `published` field: - -```prisma line-number file=schema.prisma highlight=3;normal showLineNumbers -model Post { - id String @id - //highlight-next-line - published Boolean @default(false) -} -``` - -#### Manually add a `@default` attribute to the Prisma model - -You can add the `@default` attribute to the Prisma model: - -```prisma line-number file=schema.prisma highlight=3;add showLineNumbers -model Post { - id String - //add-next-line - published Boolean @default(false) -} -``` - -If the `@default` attribute is set in the Prisma schema and you run `prisma generate`, the resulting Prisma Client code will generate the specified default values at runtime (similar to what the Prisma 1 server did in Prisma 1). - -## Generated CUIDs as ID values aren't represented in database - -### Problem - -Prisma 1 auto-generates ID values as CUIDs for `ID` fields when they're annotated with the `@id` directive. These CUIDs are generated by the Prisma 1 server at runtime. Because this behavior is not reflected in the database itself, the introspection in Prisma ORM 2._x_ and later can't recognize it. - -### Example - -#### Prisma 1 datamodel - -```graphql -type Post { - id: ID! @id -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "Post" ( - id VARCHAR(25) PRIMARY KEY NOT NULL -); -``` - -#### Result of introspection in Prisma ORM versions 2._x_ and later - -```prisma file=schema.prisma showLineNumbers -model Post { - id String @id -} -``` - -Because there's no indication of the CUID behavior in the database, Prisma ORM's introspection doesn't recognize it. - -### Workaround - -As a workaround, you can manually add the `@default(cuid())` attribute to the Prisma model: - -```prisma line-number file=schema.prisma highlight=2;add showLineNumbers -model Post { - //add-next-line - id String @id @default(cuid()) -} -``` - -If the `@default` attribute is set in the Prisma schema and you run `prisma generate`, the resulting Prisma Client code will generate the specified default values at runtime (similar to what the Prisma 1 server did in Prisma 1). - -Note that you'll have to re-add the attribute after each introspection because introspection removes it (as the previous version of the Prisma schema is overwritten)! - -## `@createdAt` isn't represented in database - -### Problem - -Prisma 1 auto-generates values for `DateTime` fields when they're annotated with the `@createdAt` directive. These values are generated by the Prisma 1 server at runtime. Because this behavior is not reflected in the database itself, the introspection in Prisma ORM 2._x_ and later can't recognize it. - -### Example - -#### Prisma 1 datamodel - -```graphql line-number highlight=3;normal -type Post { - id: ID! @id - createdAt: DateTime! @createdAt -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "Post" ( - id VARCHAR(25) PRIMARY KEY NOT NULL, - "createdAt" TIMESTAMP NOT NULL -); -``` - -#### Result of introspection in Prisma ORM 2._x_ and later versions - -```prisma file=schema.prisma showLineNumbers -model Post { - id String @id - createdAt DateTime -} -``` - -### Workarounds - -#### Manually add `DEFAULT CURRENT_TIMESTAMP` to the database column - -You can alter the column to add the `DEFAULT` constraint as follows: - -```sql -ALTER TABLE "Post" - ALTER COLUMN "createdAt" SET DEFAULT CURRENT_TIMESTAMP; -``` - -After this adjustment, you can re-introspect your database and the `@default` attribute will be added to the `createdAt` field: - -```prisma file=schema.prisma showLineNumbers -model Post { - id String - createdAt DateTime @default(now()) -} -``` - -#### Manually add the `@default(now())` attribute to the Prisma model - -As a workaround, you can manually add the `@default(now())` attribute to the Prisma model: - -```prisma line-number file=schema.prisma highlight=3;normal -model Post { - id String @id - //highlight-next-line - createdAt DateTime @default(now()) -} -``` - -If the `@default` attribute is set in the Prisma schema and you run `prisma generate`, the resulting Prisma Client code will generate the specified default values at runtime (similar to what the Prisma 1 server did in Prisma 1). - -Note that you'll have to re-add the attribute after each introspection because introspection removes it (as the previous version of the Prisma schema is overwritten)! - -## `@updatedAt` isn't represented in database - -### Problem - -Prisma 1 auto-generates values for `DateTime` fields when they're annotated with the `@updatedAt` directive. These values are generated by the Prisma 1 server at runtime. Because this behavior is not reflected in the database itself, the introspection in Prisma ORM 2._x_ and later can't recognize it.. - -### Example - -#### Prisma 1 datamodel - -```graphql -type Post { - id: ID! @id - updatedAt: DateTime! @updatedAt -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "Post" ( - id VARCHAR(25) PRIMARY KEY NOT NULL, - updatedAt TIMESTAMP -); -``` - -#### Result of introspection in Prisma ORM 2._x_ and later versions - -```prisma file=schema.prisma showLineNumbers -model Post { - id String @id - updatedAt DateTime -} -``` - -### Workarounds - -#### Manually add the `@updatedAt` attribute to the Prisma model - -As a workaround, you can manually add the `@updatedAt` attribute to the Prisma model: - -```prisma line-number file=schema.prisma highlight=3;add -model Post { - id String @id - //add-next-line - updatedAt DateTime @updatedAt -} -``` - -If the `@updatedAt` attribute is set in the Prisma schema and you run `prisma generate`, the resulting Prisma Client code will automatically generate values for this column when an existing record is updated (similar to what the Prisma 1 server did in Prisma 1). - -Note that you'll have to re-add the attribute after each introspection because introspection removes it (as the previous version of the Prisma schema is overwritten)! - -## Inline 1-1 relations are recognized as 1-n (missing `UNIQUE` constraint) - -### Problem - -In the [datamodel v1.1](https://www.prisma.io/blog/datamodel-v11-lrzqy1f56c90) that was introduced in Prisma ORM v1.31, 1-1 relations can be declared as _inline_. In that case, the relation will not be maintained via a [relation table](/orm/prisma-schema/data-model/relations/many-to-many-relations#relation-tables) but via a single foreign key on one of the two tables involved. - -When this approach is used, Prisma ORM doesn't add a `UNIQUE` constraint to the foreign key column which means that after introspection in Prisma ORM version 2._x_ and later, this former 1-1 relation will be added as a 1-n relation to the Prisma schema. - -### Example - -#### Prisma ORM datamodel v1.1 (available from Prisma ORM v1.31) - -```graphql -type User { - id: ID! @id - profile: Profile @relation(link: INLINE) -} - -type Profile { - id: ID! @id - user: User -} -``` - -Note that omitting the `@relation` directive in this case would result in the same behavior because `link: INLINE` is the _default_ for 1-1 relations. - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "User" ( - id VARCHAR(25) PRIMARY KEY NOT NULL -); - -CREATE TABLE "Profile" ( - id VARCHAR(25) PRIMARY KEY NOT NULL, - "user" VARCHAR(25), - FOREIGN KEY ("user") REFERENCES "User"(id) -); -``` - -#### Result of introspection in Prisma ORM 2._x_ and later versions - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id - Profile Profile[] -} - -model Profile { - id String @id - user String? - User User? @relation(fields: [user], references: [id]) -} -``` - -Because there's no `UNIQUE` constraint defined on the `user` column (which represents the foreign key in this relation), Prisma ORM's introspection recognizes the relation as 1-n. - -### Workaround - -#### Manually add `UNIQUE` constraint to the foreign key column - -You can alter the foreign key column to add the `UNIQUE` constraint as follows: - -```sql -ALTER TABLE "Profile" - ADD CONSTRAINT userId_unique UNIQUE ("user"); -``` - -After this adjustment, you can re-introspect your database and the 1-1 relation will be properly recognized: - -```prisma line-number file=schema.prisma highlight=3;normal -model User { - id String @id - //highlight-next-line - Profile Profile? -} - -model Profile { - id String @id - user String? @unique - User User? @relation(fields: [user], references: [id]) -} -``` - -## _All_ non-inline relations are recognized as m-n - -### Problem - -Prisma 1 represents relations as relation tables most of the time: - -- All relations in the Prisma 1 **datamodel v1.0** are represented as relation tables -- In **datamodel v1.1**, all m-n relations as well as the 1-1 and 1-n relations declared as `link: TABLE` are represented as relation tables. - -Because of this representation, introspection in Prisma ORM version 2._x_ and later will recognize all these relations as m-n relations, even though they might have been declared as 1-1 or 1-n in Prisma 1. - -### Example - -#### Prisma 1 datamodel - -```graphql -type User { - id: ID! @id - posts: [Post!]! -} - -type Post { - id: ID! @id - author: User! @relation(link: TABLE) -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "User" ( - id VARCHAR(25) PRIMARY KEY NOT NULL -); - -CREATE TABLE "Post" ( - id VARCHAR(25) PRIMARY KEY NOT NULL -); - -CREATE TABLE "_PostToUser" ( - "A" VARCHAR(25) NOT NULL REFERENCES "Post"(id) ON DELETE CASCADE, - "B" VARCHAR(25) NOT NULL REFERENCES "User"(id) ON DELETE CASCADE -); -CREATE UNIQUE INDEX "_PostToUser_AB_unique" ON "_PostToUser"("A" text_ops,"B" text_ops); -CREATE INDEX "_PostToUser_B" ON "_PostToUser"("B" text_ops); -``` - -#### Result of introspection in Prisma ORM 2._x_ and later versions - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id - Post Post[] @relation(references: [id]) -} - -model Post { - id String @id - User User[] @relation(references: [id]) -} -``` - -Because the relation table that was created by Prisma 1 uses the same [conventions for relation tables](/orm/prisma-schema/data-model/relations/many-to-many-relations#conventions-for-relation-tables-in-implicit-m-n-relations) as in Prisma ORM version 2._x_ and later, the relation now gets recognized as a m-n relation. - -### Workaround - -As a workaround, you can migrate the data into a structure that's compatible with Prisma ORM's 1-n relation: - -1. Create new column `authorId` on the `Post` table. This column should be a _foreign key_ that references the `id` field of the `User` table: - ```sql - ALTER TABLE "Post" ADD COLUMN "authorId" VARCHAR(25); - ALTER TABLE "Post" - ADD CONSTRAINT fk_author - FOREIGN KEY ("authorId") - REFERENCES "User"("id"); - ``` -1. Write a SQL query that reads all the rows from the `_PostToUser` relation table and for each row: - 1. Finds the respective `Post` record by looking up the value from column `A` - 1. Inserts the value from column `B` as the value for `authorId` into that `Post` record - ```sql - UPDATE "Post" post - SET "authorId" = post_to_user."B" - FROM "_PostToUser" post_to_user - WHERE post_to_user."A" = post."id"; - ``` -1. Delete the `_PostToUser` relation table - ```sql - DROP TABLE "_PostToUser"; - ``` - -After that you can introspect your database and the relation will now be recognized as 1-n: - -```prisma line-number file=schema.prisma highlight=3,8,9;normal -model User { - id String @id - //highlight-next-line - Post Post[] -} - -model Post { - id String @id - //highlight-start - User User @relation(fields: [authorId], references: [id]) - authorId String - //highlight-end -} -``` - -## `Json` type is represented as `TEXT` in database - -### Problem - -Prisma 1 supports the `Json` data type in its datamodel. However, in the underlying database, fields of type `Json` are actually stored as plain strings using the `TEXT` data type of the underlying database. Any parsing and validation of the stored JSON data is done by the Prisma 1 server at runtime. - -### Example - -#### Prisma 1 datamodel - -```graphql -type User { - id: ID! @id - jsonData: Json -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "User" ( - id VARCHAR(25) PRIMARY KEY NOT NULL, - jsonData TEXT -); -``` - -#### Result of introspection in Prisma ORM 2._x_ and later versions - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id - jsonData String? -} -``` - -### Workaround - -You can manually change the type of the column to `JSON` - -```sql -ALTER TABLE "User" ALTER COLUMN "jsonData" TYPE JSON USING "jsonData"::json; -``` - -After this adjustment, you can re-introspect your database and the field will now be recognized as `Json`: - -```prisma line-number file=schema.prisma highlight=3;normal showLineNumbers -model User { - id String @id - //highlight-next-line - jsonData Json? -} -``` - -## Enums are represented as `TEXT` in database - -### Problem - -Prisma 1 supports the `enum` data type in its datamodel. However, in the underlying database, types declared as `enum` are actually stored as plain strings using the `TEXT` data type of the underlying database. Any validation of the stored `enum` data is done by the Prisma 1 server at runtime. - -### Example - -#### Prisma 1 datamodel - -```graphql -type User { - id: ID! @id - role: Role -} - -enum Role { - ADMIN - CUSTOMER -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "User" ( - id VARCHAR(25) PRIMARY KEY NOT NULL, - role TEXT -); -``` - -#### Result of introspection in Prisma ORM 2._x_ and later versions - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id - role String? -} -``` - -### Workaround - -You can manually turn the `role` column into an enum with your desired values: - -1. Create an `enum` in your database that mirrors the `enum` you defined in the Prisma 1 datamodel: - ```sql - CREATE TYPE "Role" AS ENUM ('CUSTOMER', 'ADMIN'); - ``` -1. Change the type from `TEXT` to your new `enum`: - ```sql - ALTER TABLE "User" ALTER COLUMN "role" TYPE "Role" - USING "role"::text::"Role"; - ``` - -After introspection, the type is now properly recognized as an enum: - -```prisma line-number file=schema.prisma highlight=3,6-9;normal showLineNumbers -model User { - id String @id - //highlight-next-line - role Role? -} - -//highlight-start -enum Role { - ADMIN - CUSTOMER -} -//highlight-end -``` - -## Mismatching CUID length - -### Problem - -Prisma 1 uses CUIDs as ID values for all database records. In the underlying database, these IDs are represented as strings with a maximum size of 25 characters (as `VARCHAR(25)`). However, when configuring default CUIDs in your Prisma ORM 2._x_ (or later versions) schema with `@default(cuid())` the generated ID values might exceed the limit of 25 characters (the maximum length might be 30 characters). To make your IDs proof for Prisma ORM 2._x_ (or later versions), you therefore need to adjust the column type to `VARCHAR(30)`. - -### Example - -#### Prisma 1 datamodel - -```graphql -type User { - id: ID! @id -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "User" ( - id VARCHAR(25) PRIMARY KEY NOT NULL -); -``` - -#### Result of introspection in Prisma ORM 2._x_ and later versions - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id -} -``` - -### Workaround - -You can manually turn the `VARCHAR(25)` columns into `VARCHAR(30)`: - -```sql -ALTER TABLE "User" ALTER COLUMN "id" SET DATA TYPE character varying(30); -``` - -> **Note**: When fixing this issue with the [Upgrade CLI](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#prisma-1-upgrade-cli), the generated SQL statements will keep appearing in the Upgrade CLI even after you have changed the column types in the underlying database. This is a currently a limitation in the Upgrade CLI. - -## Scalar lists (arrays) are maintained with extra table - -### Problem - -In Prisma 1, you can define lists of _scalar_ types on your models. Under the hood, this is implemented with an extra table that keeps track of the values in the list. - -To remove the approach with the extra table which incurred hidden performance costs, Prisma ORM 2._x_ and later versions only support scalar lists only when they're natively supported by the database you use. At the moment, only [PostgreSQL supports scalar lists (arrays) natively](https://www.postgresql.org/docs/9.1/arrays.html). - -With PostgreSQL, you therefore can keep using scalar lists in Prisma ORM 2._x_ and later versions, but you'll need to perform a data migration to transfer the data from the extra table from Prisma 1 into an actual PostgreSQL array. - -### Example - -#### Prisma 1 datamodel - -```graphql -type User { - id: ID! @id - coinflips: [Boolean!]! @scalarList(strategy: RELATION) -} -``` - -#### Prisma 1 generated SQL migration - -```sql -CREATE TABLE "User" ( - id VARCHAR(25) PRIMARY KEY NOT NULL -); - -CREATE TABLE "User_coinflips" ( - "nodeId" VARCHAR(25) REFERENCES "User"(id), - position INTEGER, - value BOOLEAN NOT NULL, - CONSTRAINT "User_coinflips_pkey" PRIMARY KEY ("nodeId", position) -); -CREATE UNIQUE INDEX "User_coinflips_pkey" ON "User_coinflips"("nodeId" text_ops,position int4_ops); -``` - -#### Result of Prisma ORM 2 introspection - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id - User_coinflips User_coinflips[] -} - -model User_coinflips { - nodeId String - position Int - value Boolean - User User @relation(fields: [nodeId], references: [id]) - - @@id([nodeId, position]) -} -``` - -Note that you can now generate Prisma Client and you'll be able to access the data from the scalar lists through the extra table. PostgreSQL users can alternatively migrate the data into a native PostgreSQL array and continue to benefit from the slicker Prisma Client API for scalar lists (read the section below for more info). - -
- -Expand for sample Prisma Client API calls - -To access the coinflips data, you will now have to always [`include`](/orm/prisma-client/queries/select-fields#return-nested-objects-by-selecting-relation-fields) it in your queries: - -```ts -const user = await prisma.user.findUnique({ - where: { id: 1 }, - include: { - coinflips: { - orderBy: { position: 'asc' }, - }, - }, -}) -``` - -> **Note**: The `orderBy` is important to retain the order of the list. - -This is the `result of the query: - -```js -{ - id: 1, - name: 'Alice', - coinflips: [ - { id: 1, position: 1000, value: false }, - { id: 2, position: 2000, value: true }, - { id: 3, position: 3000, value: false }, - { id: 4, position: 4000, value: true }, - { id: 5, position: 5000, value: true }, - { id: 6, position: 6000, value: false } - ] -} -``` - -To access just the boolean values from the list, you can `map` over the `coinflips` on `user` as follows: - -```ts -const currentCoinflips = user!.coinflips.map((cf) => cf.value) -``` - -> **Note**: The exclamation mark above means that you're _force unwrapping_ the `user` value. This is necessary because the `user` returned from the previous query might be `null`. - -Here's the value of `currentCoinflips` after the call to `map`: - -```json -[false, true, false, true, true, false] -``` - -
- -### Workaround - -The following workaround is only available for PostgreSQL users! - -As scalar lists (i.e. [arrays](https://www.postgresql.org/docs/9.1/arrays.html)) are available as a native PostgreSQL feature, you can keep using the same notation of `coinflips: Boolean[]` in your Prisma schema. - -However, in order to do so you need to manually migrate the underlying data from the `User_coinflips` table into a PostgreSQL array. Here's how you can do that: - -1. Add the new `coinflips` column to the `User` tables: - ```sql - ALTER TABLE "User" ADD COLUMN coinflips BOOLEAN[]; - ``` -1. Migrate the data from `"User_coinflips".value` to `"User.coinflips"`: - ```sql - UPDATE "User" - SET coinflips = t.flips - FROM ( - SELECT "nodeId", array_agg(VALUE ORDER BY position) AS flips - FROM "User_coinflips" - GROUP BY "nodeId" - ) t - where t."nodeId" = "User"."id"; - ``` -1. To cleanup, you can delete the `User_coinflips` table: - ```sql - DROP TABLE "User_coinflips"; - ``` - -You can now introspect your database and the `coinflips` field will be represented as an array in your new Prisma schema: - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id - coinflips Boolean[] -} -``` - -You can keep using Prisma Client as before: - -```ts -const user = await prisma.user.findUnique({ - where: { id: 1 }, -}) -``` - -This is the result from the API call: - -```js -{ - id: 1, - name: 'Alice', - coinflips: [ false, true, false, true, true, false ] -} -``` diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer-mysql.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer-mysql.mdx deleted file mode 100644 index 1a8607c050..0000000000 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer-mysql.mdx +++ /dev/null @@ -1,1311 +0,0 @@ ---- -title: 'Upgrading the Prisma ORM layer' -metaTitle: 'Upgrading the Prisma ORM layer to Prisma ORM 2 | MySQL' -metaDescription: 'Learn how to upgrade the Prisma ORM layer to Prisma ORM 2 and create your Prisma schema with MySQL' -dbSwitcher: ['postgresql', 'mysql'] -sidebar_class_name: hidden-sidebar -pagination_next: orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus -slugSwitch: /orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer- ---- - -## Overview - -This page explains the first step of your upgrade process: Taking your Prisma 1 configuration and upgrading it to Prisma ORM 2. Concretely, you will learn how to: - -1. Add the Prisma ORM 2 CLI as a development dependency -1. Create your Prisma ORM 2 schema -1. Determine your connection URL and connect to your database -1. Introspect your database (that was so far managed with Prisma 1) -1. Use the [Prisma 1 Upgrade CLI](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#prisma-1-upgrade-cli) to resolve the [schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql) in the new Prisma ORM 2 data model -1. Install and generate Prisma Client - -Once done with these steps, you can move on to the next guide that explains how you can upgrade the application layer to use Prisma Client for your database queries. - -> **Note**: During the upgrade process it can be helpful to get a graphical view on your database. It is therefore recommended to use a graphical database client to connect to your database, such as [TablePlus](https://tableplus.com/) or [Postico](https://eggerapps.at/postico/). - -## 1. Install Prisma ORM 2 CLI - -The Prisma ORM 2 CLI is available as the [`prisma`](https://www.npmjs.com/package/prisma) package on npm and is invoked via the `prisma` command. - -Note that the former `prisma` command for Prisma 1 has been renamed to `prisma1`. You can learn more about this [here](https://www.prisma.io/blog/prisma-2-beta-b7bcl0gd8d8e#renaming-the-prisma2-cli). - -You can install the Prisma ORM 2 CLI in your Node.js project as follows (be sure to invoke this command in the directory where your `package.json` is located): - -```terminal copy -npm install prisma --save-dev -``` - -> **Note**: With Prisma 1, it was usually recommended to install the CLI globally. We now recommend to [install the Prisma CLI locally](/orm/tools/prisma-cli#installation) to prevent version conflicts. - -You can now use the local installation of the `prisma` CLI by prefixing it with `npx`: - -```terminal -npx prisma -``` - -If you're upgrading your entire project [all at once](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#upgrade-strategies), you can now also uninstall the Prisma 1 CLI (otherwise expand below): - -```terminal -# remove global installation -npm uninstall -g prisma1 - -# remove local installation -npm uninstall prisma1 -``` - -
- -
- -Expand if you want to keep using your Prisma 1 CLI side-by-side - -If you want to keep using the Prisma 1 CLI, it is recommend to remove your global installation of it and add the `prisma1` CLI as a development dependency: - -```terminal -# installs v1.34 of the Prisma 1 CLI -npm uninstall -g prisma -npm install prisma1 --save-dev -``` - -You can now invoke it as follows: - -```terminal -npx prisma1 -``` - -Note that if you need a CLI version smaller than 1.34 (e.g. 1.30), you can install it as follows: - -```terminal -# installs v1.30 of the Prisma 1 CLI -npm uninstall -g prisma@1.30 -npm install prisma@1.30 --save-dev -``` - -You can now invoke it as follows: - -```terminal -npx prisma -``` - -
- -## 2. Create your Prisma ORM 2 schema - -For this guide, you'll first create a new Prisma schema using the `prisma init` command and then "fill" it with a data model using [introspection](/orm/prisma-schema/introspection). - -Run the following command to create your Prisma schema (note that this throws an error if you already have a folder called `prisma`): - -```terminal copy -npx prisma init -``` - -If you're seeing the following error, you need to rename your current `prisma` directory: - -```no-lines -ERROR A folder called prisma already exists in your project. - Please try again in a project that is not yet using Prisma. -``` - -You can rename the current `prisma` directory to `prisma1` to make it clear that this holds the former Prisma 1 configuration: - -```terminal copy -mv prisma prisma1 -``` - -Now you can run `init` and it will succeed: - -```terminal copy -npx prisma init -``` - -It should print the following output: - -```no-lines wrap -✔ Your Prisma schema was created at prisma/schema.prisma. - You can now open it in your favorite editor. - -Next steps: -1. Set the `DATABASE_URL` in the `.env` file to point to your existing database. If your database has no tables yet, read https://pris.ly/d/getting-started -2. Set the `provider` of your `datasource` block in `schema.prisma` to match your database: `postgresql`, `mysql` or `sqlite`. -3. Run `prisma db pull` to turn your database schema into a Prisma data model. -4. Run `prisma generate` to install Prisma Client. You can then start querying your database. - -More information in our documentation: -https://pris.ly/d/getting-started -``` - -The command created a new folder called `prisma`, and two files: - -- `prisma/schema.prisma`: Your Prisma schema that specifies the [data source](/orm/prisma-schema/overview/data-sources), [generator](/orm/prisma-schema/overview/generators) and [data model](/orm/prisma-schema/data-model/models) (note that the data model doesn't exist yet, it will be generated via introspection). -- `.env`: A [dotenv](https://github.com/motdotla/dotenv) file to configure your database [connection URL](/orm/reference/connection-urls). - -Your initial Prisma schema looks as follows: - -```prisma file=schema.prisma showLineNumbers -// This is your Prisma schema file, -// learn more about it in the docs: https://pris.ly/d/prisma-schema - -datasource db { - provider = "mysql" - url = env("DATABASE_URL") -} - -generator client { - provider = "prisma-client-js" -} -``` - -With Prisma 1, you specify which language variant of Prisma Client you wanted to use in your `prisma.yml`. With Prisma ORM 2, this information is now specified inside the Prisma schema via a `generator` block. - -> **Note**: Unlike Prisma 1, the TypeScript and JavaScript variants of Prisma Client 2.0 use the _same_ generator called `prisma-client-js`. The generated types in `index.d.ts` are _always_ included, even in plain JavaScript projects. This enables feature like autocompletion in VS Code even when not using TypeScript. - -## 3. Determine your connection URL and connect to your database - -With Prisma 1, the database connection is configured in the Docker Compose file that's used to launch the Prisma ORM server. The Prisma ORM server then exposes a GraphQL endpoint (via HTTP) that proxies all database requests from the Prisma Client application code. That HTTP endpoint is specified in your `prisma.yml`. - -With Prisma ORM 2, the HTTP layer isn't exposed any more and Prisma Client 2.0 is configured to run requests "directly" against the database (that is, requests are proxied by Prisma ORM's [query engine](/orm/more/under-the-hood/engines), but there isn't an extra server any more). - -So, as a next step you'll need to tell Prisma ORM 2 _what_ kind of database you use (MySQL or PostgreSQL) and _where_ it is located. - -First, you need to ensure that that `provider` field on the `datasource` block inside `schema.prisma` is configured to use the right database: - -- If you're using PostgreSQL, it needs to define the value `"postgresql"` in the `provider` field. -- If you're using MySQL, it needs to define the value `"mysql"` in the `provider` field. - -Switch around with the tabs in the code block to see examples of both: - - - - -```prisma -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} -``` - - - - -```prisma -datasource db { - provider = "mysql" - url = env("DATABASE_URL") -} -``` - - - - -With the `provider` field set, you can go ahead and configure the connection URL inside the `.env` file. - -Assume the database configuration in your Docker Compose file that you used to deploy your Prisma ORM server looks as follows: - -```yml file=docker-compose.yml -PRISMA_CONFIG: | - port: 4466 - databases: - default: - connector: mysql - host: mysql - port: 3306 - user: root - password: randompassword -``` - -Also assume your `endpoint` in `prisma.yml` is configured as follows: - -```yml file=prisma.yml -endpoint: http://localhost:4466/myproject/dev -``` - -Based on these connection details, you need to configure the `DATABASE_URL` environment variable inside your `.env` file as follows: - -```bash file=.env -DATABASE_URL="mysql://root:randompassword@localhost:3306/myproject@dev" -``` - -Note that the _database name_ in the connection URL is typically composed of your _service name_ and _service stage_ (which are part of the `endpoint` in `prisma.yml`), separated by the `@` character. - -Sometimes no service name and stage are specified in `prisma.yml`: - -```yml file=prisma.yml -endpoint: http://localhost:4466/ -``` - -In that case, the database name must be specified as follows: - -```bash file=.env -DATABASE_URL="mysql://root:randompassword@localhost:3306/default@default" -``` - -Learn more on the [Connection URLs](/orm/reference/connection-urls) page. - -## 4. Introspect your database - -For the purpose of this guide, we'll use the following Prisma 1 data model (select the **SQL** tab below to see what the data model maps to in SQL): - - - - -```graphql -type User { - id: ID! @id - email: String @unique - name: String! - role: Role! @default(value: CUSTOMER) - jsonData: Json - profile: Profile - posts: [Post!]! -} - -type Post { - id: ID! @id - createdAt: DateTime! @createdAt - updatedAt: DateTime! @updatedAt - title: String! - content: String - published: Boolean! @default(value: false) - author: User @relation(link: TABLE) - categories: [Category!]! -} - -type Profile { - id: ID! @id - bio: String - user: User! @relation(link: INLINE) -} - -type Category { - id: ID! @id - name: String! - posts: [Post!]! -} - -enum Role { - ADMIN - CUSTOMER -} -``` - - - - -```sql -CREATE TABLE"User" ( - id character varying(25) PRIMARY KEY, - email text, - name text NOT NULL, - role text NOT NULL, - "jsonData" text -); -CREATE UNIQUE INDEX "User_pkey" ON"User"(id text_ops); -CREATE UNIQUE INDEX "default$default.User.email._UNIQUE" ON"User"(email text_ops); - -CREATE TABLE"Post" ( - id character varying(25) PRIMARY KEY, - title text NOT NULL, - published boolean NOT NULL, - "createdAt" timestamp(3) without time zone NOT NULL, - "updatedAt" timestamp(3) without time zone NOT NULL, - content text -); -CREATE UNIQUE INDEX "Post_pkey" ON"Post"(id text_ops); - -CREATE TABLE"Profile" ( - id character varying(25) PRIMARY KEY, - bio text, - user character varying(25) REFERENCES"User"(id) ON DELETE SET NULL -); -CREATE UNIQUE INDEX "Profile_pkey" ON"Profile"(id text_ops); - -CREATE TABLE"Category" ( - id character varying(25) PRIMARY KEY, - name text NOT NULL -); -CREATE UNIQUE INDEX "Category_pkey" ON"Category"(id text_ops); - -CREATE TABLE"_PostToUser" ( - "A" character varying(25) NOT NULL REFERENCES"Post"(id) ON DELETE CASCADE, - "B" character varying(25) NOT NULL REFERENCES"User"(id) ON DELETE CASCADE -); -CREATE UNIQUE INDEX "_PostToUser_AB_unique" ON"_PostToUser"("A" text_ops,"B" text_ops); -CREATE INDEX "_PostToUser_B" ON"_PostToUser"("B" text_ops); - -CREATE TABLE"_CategoryToPost" ( - "A" character varying(25) NOT NULL REFERENCES"Category"(id) ON DELETE CASCADE, - "B" character varying(25) NOT NULL REFERENCES"Post"(id) ON DELETE CASCADE -); -CREATE UNIQUE INDEX "_CategoryToPost_AB_unique" ON"_CategoryToPost"("A" text_ops,"B" text_ops); -CREATE INDEX "_CategoryToPost_B" ON"_CategoryToPost"("B" text_ops); -``` - - - - -Note that this data model has three [relations](/orm/prisma-schema/data-model/relations): - -- 1-1: `User` ↔ `Profile` -- 1-n: `User` ↔ `Post` (maintained via the `_PostToUser` relation table) -- m-n: `Post` ↔ `Category` (maintained via the `_CategoryToPost` relation table) - -Now you can run Prisma ORM's introspection against your database with the following command: - -```terminal copy -npx prisma db pull -``` - -Here's a graphical illustration for what happens when `db pull` is invoked: - -![Introspect your database](/img/orm/prisma-db-pull-generate-schema.png) - -For the above Prisma 1 datamodel, this results in the following Prisma ORM 2 schema (note that the models have been reordered to match the initial order of the Prisma 1 datamodel): - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id @default(cuid()) - email String? @unique - name String - role String - jsonData String? - Profile Profile[] - Post Post[] -} - -model Post { - id String @id @default(cuid()) - createdAt DateTime - updatedAt DateTime - title String - content String? - published Boolean - Category Category[] - User User[] -} - -model Profile { - id String @id @default(cuid()) - bio String? - user String? @unique - User User? @relation(fields: [user], references: [id]) -} - -model Category { - id String @id @default(cuid()) - name String - Post Post[] -} -``` - -While this is already a valid Prisma ORM 2 schema, it lacks a number of _features_ that were part of its Prisma 1 equivalent: - -- no auto-generated date values for the `createdAt` and `updatedAt` fields on `Post` -- no default value for the `role` field on `User` -- no default value for the `published` field on `Post` - -There further are a number of inconsistencies which result in a less idiomatic/ergonomic Prisma Client API: - -- `User` ↔ `Profile` is a 1-n instead of 1-1 relation -- `User` ↔ `Post` is a m-n instead of 1-n relation -- relation fields are uppercased (e.g. `Profile` and `Post` on `User`) -- the `jsonData` field on `User` is of type `String` instead of `Json` -- the `role` field on `User` is of type `String` instead of `Role`, the `enum` definition for role is missing altogether - -While these inconsistencies don't actually impact the "feature set" you'll have available in your Prisma Client API, they make you lose certain constraints/guarantees that were present before. - -For example, Prisma ORM now won't guarantee that a `User` is connected to _at most_ one `Profile` because the relation between the tables was recognized as 1-n during introspection, so one `User` record _could_ now get connected to multiple `Profile` records. - -Another issue is that you can store whatever text for the `jsonData` and `role` fields, regardless of whether it's valid JSON or represents a value of the `Role` enum. - -To learn more about these inconsistencies check out the [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql) page. - -In the following, we'll go through these incompatibilities and fix them one by one using the Prisma schema upgrade CLI. - -## 5. Use the Prisma schema upgrade CLI to resolve schema incompatibilities - -The [Prisma 1 Upgrade CLI](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#prisma-1-upgrade-cli) is an interactive tool that helps you upgrading your Prisma schema and ironing out most of the inconsistencies listed above. - -The Prisma 1 Upgrade CLI works in two major phases: - -1. Fix the database schema via plain SQL -1. Add missing attributes to the Prisma ORM 2 schema and other schema fixes - -During the first phase, it will generate and print a number of SQL statements that you should run against your database to adjust the database schema. You can either run all of the statements or a subset of them before continuing to the second phase. - -During the second phase, you don't need to do anything manually. The Upgrade CLI will make changes to your Prisma schema by adding certain Prisma ORM-level attributes (like `@default(cuid))` or `@updatedAt`), adjusting the names of relation fields to match the ones from your Prisma 1 datamodel and ensure 1-1-relations that were required on both sides in your Prisma 1 datamodel are also required in the Prisma ORM 2 schema. - -Note that **you can start over at any time during the process** and go back from the second to the first phase. - -In this illustration, the green area shows the first phase, the blue area shows the second phase. Note that you can optionally run `prisma db pull` in between the phases to update your Prisma ORM data model: - -![Fixing the schema incompatibilities](./images/fix-schema-incompatibilities.png) - -To use the Upgrade CLI, you can either install it locally in your project, or invoke it once without installation using `npx` as done here: - -```terminal copy -npx prisma-upgrade prisma1/prisma.yml prisma/schema.prisma -``` - -The CLI will greet you with the following message: - -```no-lines wrap -◮ Welcome to the interactive Prisma Upgrade CLI that helps with the -upgrade process from Prisma 1 to Prisma ORM 2. - -Please read the docs to learn more about the upgrade process: -https://pris.ly/d/how-to-upgrade - -➤ Goal -The Upgrade CLI helps you resolve the schema incompatibilities -between Prisma 1 and Prisma ORM 2. Learn more in the docs: -https://pris.ly/d/schema-incompatibilities - -➤ How it works -Throughout the process, you'll need to adjust your database schema by sending -SQL statements to it. The SQL statements are provided by the Upgrade CLI. - -Note that the Upgrade CLI never makes changes to your database, -you are in full control over any operations that are executed against it. - -You can stop and re-run the Upgrade CLI at any time. - -These are the different steps of the upgrade process: - - 1. The Upgrade CLI generates SQL commands for you to run on your database. - 2. You run the SQL commands against your database. - 3. You run the `npx prisma db pull` command again. - 4. You run the `npx prisma-upgrade` command again. - 5. The Upgrade CLI adjusts the Prisma ORM 2 schema by adding missing attributes. - -➤ Note -It is recommended that you make a full backup of your existing data before starting -the upgrade process. If possible, the migration should be performed in a staging -environment before executed against a production environment. - -➤ Help -If you have any questions or run into any problems along the way, -please create an issue at: -https://github.com/prisma/prisma1-upgrade/issues/new - -Are you ready? [Y/n] -``` - -Press the Y button, then confirm by hitting RETURN on your keyboard to continue. - -Once you confirmed, the CLI outputs the SQL statements you should be running against your database: - -```no-lines wrap -➤ Adjust your database schema -Run the following SQL statements against your database: - - Fix columns with ENUM data types - https://pris.ly/d/schema-incompatibilities#enums-are-represented-as-text-in-database - - ALTER TABLE `User` CHANGE `role` `role` ENUM('ADMIN', 'CUSTOMER') NOT NULL; - - - Add missing `DEFAULT` constraints to the database - https://pris.ly/d/schema-incompatibilities#default-values-arent-represented-in-database - - ALTER TABLE `User` CHANGE `role` `role` ENUM('ADMIN', 'CUSTOMER') NOT NULL DEFAULT 'CUSTOMER'; - ALTER TABLE `Post` CHANGE `published` `published` TINYINT(1) NOT NULL DEFAULT 0; - - - Fix columns with JSON data types - https://pris.ly/d/schema-incompatibilities#json-type-is-represented-as-text-in-database - - ALTER TABLE `User` CHANGE `jsonData` `jsonData` JSON ; - - - Replicate `@createdAt` behavior in Prisma ORM 2.0 - https://pris.ly/d/schema-incompatibilities#createdat-isnt-represented-in-database - - ALTER TABLE `Post` CHANGE `createdAt` `createdAt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP; - - - Fix 1-1 relations by adding `UNIQUE` constraints - https://pris.ly/d/schema-incompatibilities#inline-1-1-relations-are-recognized-as-1-n-missing-unique-constraint - - ALTER TABLE `Profile` ADD UNIQUE (`user`); - - - Migrate IDs from varchar(25) to varchar(30) - https://pris.ly/d/schema-incompatibilities#mismatching-cuid-length - - SET FOREIGN_KEY_CHECKS=0; - ALTER TABLE `Category` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; - ALTER TABLE `Post` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; - ALTER TABLE `Profile` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; - ALTER TABLE `Profile` CHANGE `user` `user` char(30) CHARACTER SET utf8 ; - ALTER TABLE `User` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; - SET FOREIGN_KEY_CHECKS=1; - -➤ Breaking changes detected - -In order to fully optimize your database schema, you'll need to run a few SQL -statements that can break your Prisma 1 setup. Note that these changes are optional -and if you are upgrading gradually and running Prisma 1 and Prisma ORM 2 side-by-side, -you should not perform these changes yet. Instead, you can perform them whenever -you are ready to completely remove Prisma 1 from your project. -If you are upgrading all at once, you can safely perform these changes now. - -Learn more in the docs: -https://pris.ly/d/how-to-upgrade' -``` - -> **Note**: If you're seeing the note about breaking changes, you can ignore it for now. We'll discuss it later. - -The shown SQL statements are categorized into a number of "buckets", all aiming to resolve a certain [schema incompatibility](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql): - -- Fix columns with ENUM data types -- Add missing `DEFAULT` constraints to the database -- Fix columns with JSON data types -- Replicate `@createdAt` behavior in Prisma 2 -- Fix 1-1 relations by adding `UNIQUE` constraints - -As a next step, you can start sending the SQL statements to your database. Note that all of these changes are non-breaking and you'll be able to continue using Prisma 1 side-by-side with Prisma ORM 2. - -The next sections cover the different kinds of SQL statements to be sent to your database individually. - -### 5.1. Fix the database schema via plain SQL (non-breaking) - -In this section, we'll walk through the printed SQL statements and run them against the database one by one. - -### 5.1.1. Fix columns with ENUM data types - -The first thing the tool does is help you ensure that `enum` definitions in your Prisma 1 datamodel will be represented as actual `ENUM` types in the underlying database, right now they are represented as plain strings (e.g. as `MEDIUMTEXT` in MySQL). - -The CLI currently shows the following output: - -```no-lines wrap -Fix columns with ENUM data types -https://pris.ly/d/schema-incompatibilities#enums-are-represented-as-text-in-database - - ALTER TABLE `User` CHANGE `role` `role` ENUM('ADMIN', 'CUSTOMER') NOT NULL; -``` - -Go ahead and run these statements against your database now. - -![Altering columns to use ENUM with SQL](./images/altering-columns-to-use-enum.png) - -### 5.1.2. Add missing `DEFAULT` constraints to the database - -Next, the Upgrade CLI helps you resolve the issue that [default values aren't represented in the database](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql#default-values-arent-represented-in-database) by generating SQL statements that add the respective `DEFAULT` constraints directly to the database. - -In this case, two `DEFAULT` constraints are missing which are suggested by the tool: - -```no-lines wrap -Add missing `DEFAULT` constraints to the database -https://pris.ly/d/schema-incompatibilities#default-values-arent-represented-in-database - - ALTER TABLE `User` CHANGE `role` `role` ENUM('ADMIN', 'CUSTOMER') NOT NULL DEFAULT 'CUSTOMER'; - ALTER TABLE `Post` CHANGE `published` `published` TINYINT(1) NOT NULL DEFAULT 0; -``` - -You can now run these SQL statements against your database either using a command line client or a GUI like TablePlus: - -![TablePlus GUI](./images/TablePlus-GUI.png) - -### 5.1.3. Fix columns with JSON data types - -Next, the tool helps you ensure that `Json` fields in your Prisma 1 datamodel will be represented as `JSON` columns in the underlying database, right now they are represented as plain strings (e.g. as `MEDIUMTEXT` in MySQL). - -Changing the column type to `JSON` will ensure that the field is properly recognized as `Json` during Prisma ORM 2 introspection. - -The CLI currently shows the following output: - -```no-lines wrap -Fix columns with JSON data types -https://pris.ly/d/schema-incompatibilities#json-type-is-represented-as-text-in-database - - ALTER TABLE `User` CHANGE `jsonData` `jsonData` JSON ; -``` - -You can now run these SQL statements against your database either using a command line client or a GUI like TablePlus: - -![TablePlus GUI](./images/fix-columns-with-json-data-types.png) - -### 5.1.4. Replicate `@createdAt` behavior in Prisma ORM 2 - -The next thing the tools does is help you resolve the issue that the behavior of [`@createdAt` isn't represented in database](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql#default-values-arent-represented-in-database) - -The CLI currently shows the following output: - -```no-lines wrap -Replicate `@createdAt` behavior in Prisma ORM 2.0 -https://pris.ly/d/schema-incompatibilities#createdat-isnt-represented-in-database - - ALTER TABLE `Post` CHANGE `createdAt` `createdAt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP; -``` - -You can now run these SQL statements against your database either using a command line client or a GUI like TablePlus. - -### 5.1.5. Fix 1-1 relations by adding `UNIQUE` constraints - -Now, the tool will help you [turn the current 1-n relation between `User` ↔ `Profile` back into a 1-1 relation](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql#inline-1-1-relations-are-recognized-as-1-n-missing-unique-constraint) by adding a `UNIQUE` constraint to the foreign key column called `user` (named after the relation field in the Prisma 1 datamodel) in the database. - -The CLI currently shows the following output: - -```no-lines wrap -Fix 1-1 relations by adding `UNIQUE` constraints -https://pris.ly/d/schema-incompatibilities#inline-1-1-relations-are-recognized-as-1-n-missing-unique-constraint - - ALTER TABLE `Profile` ADD UNIQUE (`user`); -``` - -You can now run these SQL statements against your database either using a command line client or a GUI like TablePlus. - -### 5.1.6. Fix mismatch of CUID length - -> **Note**: These SQL statements will keep appearing in the Upgrade CLI even after you have changed the column types in the underlying database. This is a currently a limitation in the Upgrade CLI. - -Finally, the tool will help you [turn the current ID columns of type `VARCHAR(25)` into `VARCHAR(30)`](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql#mismatching-cuid-length) by adding a `UNIQUE` constraint to the foreign key column called `user` (named after the relation field in the Prisma 1 datamodel) in the database. - -The CLI currently shows the following output: - -```no-lines wrap -Migrate IDs from varchar(25) to varchar(30) -https://pris.ly/d/schema-incompatibilities#mismatching-cuid-length - -SET FOREIGN_KEY_CHECKS=0; -ALTER TABLE `Category` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; -ALTER TABLE `Post` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; -ALTER TABLE `Profile` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; -ALTER TABLE `Profile` CHANGE `user` `user` char(30) CHARACTER SET utf8 ; -ALTER TABLE `User` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; -SET FOREIGN_KEY_CHECKS=1; -``` - -You can now run these SQL statements against your database either using a command line client or a GUI like TablePlus. - -### 5.1.7. Breaking changes detected - -In case the Upgrade CLI has printed a note about breaking changes, your database schema needs some adjustments that will break Prisma 1 compatibility in order to be fully optimized. - -If there are no breaking changes detected, you can [skip forward to section 5.2](#52-re-introspect-your-database-to-update-your-prisma-schema) - -Depending on your [upgrade strategy](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#upgrade-strategies), you can either perform these changes now or skip to the next phase of the Upgrade CLI: - -- If you are following the gradual side-by-side upgrade strategy, do not perform these changes yet since they will break your Prisma 1 setup. In that case, you can continue to the next phase of the Upgrade CLI by typing n and hitting RETURN. -- If you are following the all at once upgrade strategy, you can perform these changes now. In that case, continue by typing Y and hitting RETURN. - -### 5.2. Fix the database schema via plain SQL (breaking) - -In this section, you'll resolve the schema incompatibilities that are breaking your Prisma 1 setup. Do not perform these changes if you are still running Prisma 1 in your project! - -### 5.2.1. Fix incorrect m-n relations - -Now, the Upgrade CLI helps you fix all 1-1 and 1-n relations that Prisma 1 represents with relation tables and that [currently only exist as m-n relations](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql#all-non-inline-relations-are-recognized-as-m-n) in your new Prisma ORM 2 schema. Concretely, this is the case for the `User` ↔ `Post` relation which currently is defined as m-n but _should_ really be a 1-n relation. - -To fix this, you'll need to perform the following migration: - -1. Create a new foreign key column on `Post` to link directly to the `User` table. -1. Migrate the foreign key values from the relation table into the new foreign key column on `Post`. -1. Delete the relation table. - -These instructions are now printed by the CLI: - -```no-lines wrap -➤ Adjust your database schema -Run the following SQL statements against your database: - - Fix one-to-many table relations - https://pris.ly/d/schema-incompatibilities#all-non-inline-relations-are-recognized-as-m-n - - ALTER TABLE `Post` ADD COLUMN `authorId` char(25) CHARACTER SET utf8 ; - ALTER TABLE `Post` ADD CONSTRAINT author FOREIGN KEY (`authorId`) REFERENCES `User`(`id`); - UPDATE `Post`, `_PostToUser` SET `Post`.`authorId` = `_PostToUser`.B where `_PostToUser`.A = `Post`.`id`; - DROP TABLE `_PostToUser`; - - -➤ Next Steps - -After you executed one or more of the above SQL statements against your database, -please run the following two commands to refresh your Prisma ORM 2 Schema and check -the changes. - - 1. Run `npx prisma db pull` again to refresh your Prisma ORM 2 schema. - 2. Run `npx prisma-upgrade` again. - -If you can't or don't want to execute the remaining SQL statements right now, you can -skip to the last step where the Upgrade CLI adds missing attributes to your Prisma ORM 2 -schema that are not picked up by introspection. - -Skip to the last step? [Y/n]? -``` - -For this fix, you'll need to run three SQL statements: - -1. Create new column `authorId` on the `Post` table. This column should be a _foreign key_ that references the `id` field of the `User` table: - ```sql no-lines - ALTER TABLE `Post` ADD COLUMN `authorId` char(25) CHARACTER SET utf8 ; - ALTER TABLE `Post` ADD CONSTRAINT author FOREIGN KEY (`authorId`) REFERENCES `User`(`id`); - ``` -1. Write a SQL query that reads all the rows from the `_PostToUser` relation table and for each row: - 1. Finds the respective `Post` record by looking up the value from column `A` - 1. Inserts the value from column `B` as the value for `authorId` into that `Post` record - ```sql no-lines - UPDATE `Post`, `_PostToUser` SET `Post`.`authorId` = `_PostToUser`.B where `_PostToUser`.A = `Post`.`id`; - ``` -1. Delete the `_PostToUser` relation table - ```sql no-lines - DROP TABLE `_PostToUser`; - ``` - -![Fixing incorrect m-n relations with SQL](./images/fix-incorrect-m-n-relations-sql.png) - -After these commands, the user ID values of the records from column `B` of the relation table are migrated to the new `authorId` column. - -### 5.2. Re-introspect your database to update your Prisma schema - -At this point, you've resolved the schema incompatibilities with the Upgrade CLI. You can now exit the Upgrade CLI for now by typing n and hitting RETURN. - -In this section, you'll update your Prisma schema with another introspection round. This time, the previous flaws of the Prisma schema will be resolved because the database schema has been adjusted: - -```terminal copy -npx prisma db pull -``` - -This time, the resulting Prisma schema looks as follows: - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id - name String - email String? @unique - jsonData Json? - role Role @default(CUSTOMER) - Post Post[] - Profile Profile? -} - -model Post { - id String @id - createdAt DateTime @default(now()) - updatedAt DateTime - title String - content String? - published Boolean @default(false) - authorId String? - User User? @relation(fields: [authorId], references: [id]) - Category Category[] @relation(references: [id]) -} - -model Category { - id String @id - name String - Post Post[] @relation(references: [id]) -} - -model Profile { - bio String? - id String @id - user String? @unique - User User? @relation(fields: [user], references: [id]) -} - -enum Role { - ADMIN - CUSTOMER -} -``` - -This schema has most issues resolved, but it still lacks the following: - -### 5.2. Add missing attributes to the Prisma 2 schema and other schema fixes - -The CLI now prints the following: - -```no-lines wrap -➤ What happens next -As a last step, some final adjustments will be made to your Prisma ORM 2 schema -to carry over some Prisma ORM-level attributes that aren't picked up by introspection. - -As a last step, some final adjustments will be made to your Prisma ORM 2.0 -schema to carry over some Prisma ORM-level attributes that aren't picked -up by introspection. - -Warning -Your current Prisma ORM 2.0 schema will be overwritten, so please -make sure you have a backup! - -Are you ready? [Y/n] -``` - -At this point, you either ran all the SQL statement that were printed by the CLI or you skipped some of them. Either way, you can now move on the last step and let the Upgrade CLI add the missing Prisma ORM 2 attributes. Typically these are the following: - -- `@default(cuid())` for your `@id` fields -- `@updatedAt` for any fields that were using this attribute in Prisma 1 -- `@map` and `@@map` as replacements for `@db` and `@@db` from Prisma 1 - -In that step, the Upgrade CLI also fixes other issues that occurred in the transition to Prisma ORM 2: - -- it makes sure that 1-1-relations that were required on both sides in Prisma 1 are also required in your Prisma ORM 2 schema -- it renames relation fields to the same names they had in your Prisma 1 datamodel ([coming soon](https://github.com/prisma/prisma1-upgrade/issues/25)) - -To apply these changes, you can re-run the Upgrade CLI: - -```terminal copy -npx prisma-upgrade prisma1/prisma.yml prisma/schema.prisma -``` - -If you did not resolve all schema incompatibilities, the Upgrade CLI now prints the remaining SQL statements (as well as the ones for migrating IDs). You can just ignore them at this point and continue to the last step by continuously typing Y and hitting RETURN when prompted. - -If you did resolve all schema incompatibilities, no SQL statements will be printed and the Upgrade CLI only outputs the following: - -```no-lines wrap -$ npx prisma-upgrade prisma1/prisma.yml prisma/schema.prisma - -➤ Next Steps - -After you executed one or more of the previous SQL statements against your database, -please run the following two commands to refresh your Prisma ORM 2 schema and check -the changes. - - 1. Run `npx prisma db pull` again to refresh your Prisma ORM 2 schema. - 2. Run `npx prisma-upgrade` again. - -If you can't or don't want to execute the remaining SQL statements right now, you can -skip to the last step where the Upgrade CLI adds missing attributes to your Prisma ORM 2 -schema that are not picked up by introspection. - -Skip to the last step? [Y/n]? -``` - -One more time, type Y and hit RETURN to confirm. - -The final prompt of the Upgrade CLI now asks you to confirm the above mentioned changes it will make to your Prisma schema: - -```no-lines wrap -➤ What happens next -As a last step, some final adjustments will be made to your Prisma ORM 2 schema -to carry over some Prisma ORM-level attributes that aren't picked up by introspection. - -As a last step, some final adjustments will be made to your Prisma ORM 2.0 -schema to carry over some Prisma ORM-level attributes that aren't picked -up by introspection. - -Warning -Your current Prisma ORM 2.0 schema will be overwritten, so please -make sure you have a backup! - -Are you ready? [Y/n] -``` - -One last time, type Y and hit RETURN to confirm. - -This is the final output of the Upgrade CLI: - -```no-lines -Updating prisma/schema.prisma... -Done updating prisma/schema.prisma! - -✔ Congratulations, you're all set! - -➤ Note -If you didn't execute all generated SQL commands against your database, -you can re-run the Upgrade CLI at any time. - -Note that the Upgrade CLI doesn't resolve all of the schema incompatibilities -between Prisma 1 and Prisma ORM 2. If you want to resolve the remaining ones, -you can do so manually by following this guide: -https://pris.ly/d/upgrading-the-prisma-layer - -➤ Next steps -Otherwise you can continue your upgrade process by installing Prisma Client 2: -npm install @prisma/client - -You can find guides for different upgrade scenarios in the docs: -https://pris.ly/d/upgrade-from-prisma-1 -``` - -### 5.3. Final result - -The final version of the Prisma schema should look as follows: - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id @default(cuid()) - name String - email String? @unique - jsonData Json? - role Role @default(CUSTOMER) - Post Post[] - Profile Profile? -} - -model Post { - id String @id @default(cuid()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - title String - content String? - published Boolean @default(false) - authorId String? - User User? @relation(fields: [authorId], references: [id]) - Category Category[] @relation(references: [id]) -} - -model Profile { - id String @id @default(cuid()) - bio String? - user String? @unique - User User? @relation(fields: [user], references: [id]) -} - -model Category { - id String @id @default(cuid()) - name String - Post Post[] @relation(references: [id]) -} - -enum Role { - ADMIN - CUSTOMER -} -``` - -### 5.4. Rename relation fields - -One thing you'll notice with this version of the Prisma ORM 2 schema is that all [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are named after their respective models, e.g: - -```prisma file=schema.prisma showLineNumbers -model User { - Post Post[] - Profile Profile? -} - -model Post { - User User? @relation(fields: [authorId], references: [id]) - Category Category[] @relation(references: [id]) -} - -model Profile { - User User? @relation(fields: [user], references: [id]) -} - -model Category { - Post Post[] @relation(references: [id]) -} -``` - -This is not ideal and you can in fact manually rename all of them to their previous versions! - -Because all relation fields are _virtual_, meaning they don't _manifest_ in the database, you can name them whatever you like. In this case, all relation fields are lowercased and sometimes pluralized. - -Here's what they look like after the rename: - -```prisma file=schema.prisma showLineNumbers -model User { - posts Post[] - profile Profile? -} - -model Post { - author User? @relation(fields: [authorId], references: [id]) - categories Category[] @relation(references: [id]) -} - -model Profile { - user String? @unique - owner User? @relation(fields: [user], references: [id]) -} - -model Category { - posts Post[] @relation(references: [id]) -} -``` - -> **Note**: For the 1-1-relation between `User` and `Profile` it was not possible to set the old name `user` for the relation field. This is because there'd be a naming conflict with the already existing [relation scalar](/orm/prisma-schema/data-model/relations#annotated-relation-fields) field that holds the foreign key. In that case, you can choose a different name or alternatively rename the foreign key column directly in the database via SQL. - -### 5.5. Resolving remaining schema incompatibilities - -There are a few schema incompatibilities that were not yet resolved by the Upgrade CLI. At this point you still haven't fixed [scalar lists](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql#scalar-lists-arrays-are-maintained-with-extra-table). You can find the recommended workarounds for this and others on the [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql) page. - -## 6. Install and generate Prisma Client - -Now that you have your Prisma ORM 2 schema ready, you can install Prisma Client with the following command: - -```terminal copy -npm install @prisma/client -``` - -## 7. Next steps - -Congratulations, you have now upgraded your Prisma ORM layer to Prisma ORM 2! From here on, you can move on to update your application code using one of the following guides: - -- [Old to new Nexus](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus): Choose this guide if you're currently running Prisma 1 with GraphQL Nexus. -- [prisma-binding to Nexus](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-nexus): Choose this guide if you're currently running Prisma 1 with `prisma-binding` and want to upgrade to [Nexus](https://nexusjs.org/) (and TypeScript). -- [prisma-binding to SDL-first](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-sdl-first): Choose this guide if you're currently running Prisma 1 with `prisma-binding` and want to upgrade to an [SDL-first](https://www.prisma.io/blog/the-problems-of-schema-first-graphql-development-x1mn4cb0tyl3) GraphQL server. -- [REST API](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-a-rest-api): Choose this guide if you're currently running Prisma 1 using Prisma Client 1 and are building a REST API. - -## Bonus: Prisma Client API comparison - -This section contains a high-level and side-by-side comparison of the Prisma Client APIs of Prisma 1 and Prisma ORM 2. For more details about the new Prisma Client API, you can explore the [Prisma Client](/orm/prisma-client) docs. - -### Reading single records - - - - - -```ts -const user = await prisma.user({ id: 1 }) -``` - - - - - -```ts -await prisma.user.findUnique({ - where: { id: 1 }, -}) -``` - - - - - -### Reading lists of records - - - - - -```ts -const user = await prisma.users() -``` - - - - - -```ts -await prisma.user.findMany() -``` - - - - - -### Filtering lists - - - - - -```ts -const users = await prisma.users({ - where: { - name: 'Alice', - }, -}) -``` - - - - - -```ts -await prisma.user.findMany({ - where: { - name: 'Alice', - }, -}) -``` - - - - - -### Paginating lists - - - - - -```ts -const posts = await prisma.posts({ - skip: 5, - first: 10, -}) -``` - - - - - -```ts -await prisma.user.findMany({ - skip: 5, - take: 10, -}) -``` - - - - - -> **Note**: You can learn more about the new pagination API in the respective [release notes](https://github.com/prisma/prisma/releases/tag/2.0.0-beta.7) or the [Pagination](/orm/prisma-client/queries/pagination) page in the docs. - -### Sorting lists - - - - - -```ts -await prisma.posts({ - orderBy: 'title_ASC', -}) -``` - - - - - -```ts -await prisma.posts({ - orderBy: { - title: 'asc', - }, -}) -``` - - - - - -### Creating records - - - - - -```ts -await prisma.createUser({ - name: 'Alice', -}) -``` - - - - - -```ts -await prisma.user.create({ - data: { - name: 'Alice', - }, -}) -``` - - - - - -### Updating records - - - - - -```ts -await prisma.updateUser({ - where: { id: 1 }, - data: { - name: 'James', - email: 'james@prisma.io', - }, -}) -``` - - - - - -```ts -await prisma.user.update({ - where: { id: 1 }, - data: { - name: 'James', - email: 'james@prisma.io', - }, -}) -``` - - - - - -### Deleting records - - - - - -```ts -await prisma.deleteUser({ id: 1 }) -``` - - - - - -```ts -await prisma.user.delete({ - where: { id: 1 }, -}) -``` - - - - - -### Selecting fields & loading relations - -In Prisma 1, the only ways to select specific fields and/or load relations of an object was by using the string-based `$fragment` and `$graphql` functions. With Prisma ORM 2, this is now done in a clean and type-safe manner using [`select`](/orm/prisma-client/queries/select-fields#select-specific-fields) and [`include`](/orm/prisma-client/queries/select-fields#return-nested-objects-by-selecting-relation-fields). - -Another benefit of this approach is that you can use `select` and `include` on _any_ Prisma Client query, e.g. `findUnique`, `findMany`, `create`, `update`, `delete`, ... - - - - - -```ts -await prisma.user({ id: 1 }).$fragment(` - fragment NameAndEmail on User { id email }` -`) -``` - - - - - -```ts -await prisma.user.findUnique({ - where: { id: 1 }, - select: { - id: true, - email: true, - }, -}) -``` - - - - - -As an example, creating a new record and only retrieving the `id` in the returned object was not possible in Prisma 1. With Prisma ORM 2 you can achieve this as follows: - -```ts -await prisma.user.create({ - data: { - name: 'Alice', - }, - select: { - id: true, - }, -}) -``` diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer-postgresql.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer-postgresql.mdx deleted file mode 100644 index 0de7156769..0000000000 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer-postgresql.mdx +++ /dev/null @@ -1,1321 +0,0 @@ ---- -title: 'Upgrading the Prisma ORM layer' -metaTitle: 'Upgrading the Prisma ORM layer to Prisma ORM 2 | PostgreSQL' -metaDescription: 'Learn how to upgrade the Prisma ORM layer to Prisma ORM 2 and create your Prisma schema with PostgreSQL' -dbSwitcher: ['postgresql', 'mysql'] -pagination_next: orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus -slugSwitch: /orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer- ---- - -## Overview - -This page explains the first step of your upgrade process: Taking your Prisma 1 configuration and upgrading it to Prisma ORM 2. Concretely, you will learn how to: - -1. Add the Prisma ORM 2 CLI as a development dependency -1. Create your Prisma ORM 2 schema -1. Determine your connection URL and connect to your database -1. Introspect your database (that was so far managed with Prisma 1) -1. Use the [Prisma 1 Upgrade CLI](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#prisma-1-upgrade-cli) to resolve the [schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) in the new Prisma ORM 2 data model -1. Install and generate Prisma Client - -Once done with these steps, you can move on to the next guide that explains how you can upgrade the application layer to use Prisma Client for your database queries. - -> **Note**: During the upgrade process it can be helpful to get a graphical view on your database. It is therefore recommended to use a graphical database client to connect to your database, such as [TablePlus](https://tableplus.com/) or [Postico](https://eggerapps.at/postico/). - -## 1. Install Prisma ORM 2 CLI - -The Prisma ORM 2 CLI is available as the [`prisma`](https://www.npmjs.com/package/prisma) package on npm and is invoked via the `prisma` command. - -Note that the former `prisma` command for Prisma 1 has been renamed to `prisma1`. You can learn more about this [here](https://www.prisma.io/blog/prisma-2-beta-b7bcl0gd8d8e#renaming-the-prisma2-cli). - -You can install the Prisma ORM 2 CLI in your Node.js project as follows (be sure to invoke this command in the directory where your `package.json` is located): - -```terminal copy -npm install prisma --save-dev -``` - -> **Note**: With Prisma 1, it was usually recommended to install the CLI globally. We now recommend to [install the Prisma CLI locally](/orm/tools/prisma-cli#installation) to prevent version conflicts. - -You can now use the local installation of the `prisma` CLI by prefixing it with `npx`: - -```terminal -npx prisma -``` - -If you're upgrading your entire project [all at once](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#upgrade-strategies), you can now also uninstall the Prisma 1 CLI (otherwise expand below): - -```terminal -# remove global installation -npm uninstall -g prisma1 - -# remove local installation -npm uninstall prisma1 -``` - -
- -
- -Expand if you want to keep using your Prisma 1 CLI side-by-side - -If you want to keep using the Prisma 1 CLI, it is recommend to remove your global installation of it and add the `prisma1` CLI as a development dependency: - -```terminal -# installs v1.34 of the Prisma 1 CLI -npm uninstall -g prisma -npm install prisma1 --save-dev -``` - -You can now invoke it as follows: - -```terminal -npx prisma1 -``` - -Note that if you need a CLI version smaller than 1.34 (e.g. 1.30), you can install it as follows: - -```terminal -# installs v1.30 of the Prisma 1 CLI -npm uninstall -g prisma@1.30 -npm install prisma@1.30 --save-dev -``` - -You can now invoke it as follows: - -```terminal -npx prisma -``` - -
- -## 2. Create your Prisma ORM 2 schema - -For this guide, you'll first create a new Prisma schema using the `prisma init` command and then "fill" it with a data model using [introspection](/orm/prisma-schema/introspection). - -Run the following command to create your Prisma schema (note that this throws an error if you already have a folder called `prisma`): - -```terminal copy -npx prisma init -``` - -If you're seeing the following error, you need to rename your current `prisma` directory: - -```no-lines -ERROR A folder called prisma already exists in your project. - Please try again in a project that is not yet using Prisma. -``` - -You can rename the current `prisma` directory to `prisma1` to make it clear that this holds the former Prisma 1 configuration: - -```terminal copy -mv prisma prisma1 -``` - -Now you can run `init` and it will succeed: - -```terminal copy -npx prisma init -``` - -It should print the following output: - -```no-lines wrap -✔ Your Prisma schema was created at prisma/schema.prisma. - You can now open it in your favorite editor. - -Next steps: -1. Set the `DATABASE_URL` in the `.env` file to point to your existing database. If your database has no tables yet, read https://pris.ly/d/getting-started -2. Set the `provider` of your `datasource` block in `schema.prisma` to match your database: `postgresql`, `mysql` or `sqlite`. -3. Run `prisma db pull` to turn your database schema into a Prisma data model. -4. Run `prisma generate` to install Prisma Client. You can then start querying your database. - -More information in our documentation: -https://pris.ly/d/getting-started -``` - -The command created a new folder called `prisma`, and two files: - -- `prisma/schema.prisma`: Your Prisma schema that specifies the [data source](/orm/prisma-schema/overview/data-sources), [generator](/orm/prisma-schema/overview/generators) and [data model](/orm/prisma-schema/data-model/models) (note that the data model doesn't exist yet, it will be generated via introspection). -- `.env`: A [dotenv](https://github.com/motdotla/dotenv) file to configure your database [connection URL](/orm/reference/connection-urls). - -Your initial Prisma schema looks as follows: - -```prisma file=schema.prisma showLineNumbers -// This is your Prisma schema file, -// learn more about it in the docs: https://pris.ly/d/prisma-schema - -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - -generator client { - provider = "prisma-client-js" -} -``` - -With Prisma 1, you specify which language variant of Prisma Client you wanted to use in your `prisma.yml`. With Prisma ORM 2, this information is now specified inside the Prisma schema via a `generator` block. - -> **Note**: Unlike Prisma 1, the TypeScript and JavaScript variants of Prisma Client 2.0 use the _same_ generator called `prisma-client-js`. The generated types in `index.d.ts` are _always_ included, even in plain JavaScript projects. This enables feature like autocompletion in VS Code even when not using TypeScript. - -## 3. Determine your connection URL and connect to your database - -With Prisma 1, the database connection is configured in the Docker Compose file that's used to launch the Prisma ORM server. The Prisma ORM server then exposes a GraphQL endpoint (via HTTP) that proxies all database requests from the Prisma Client application code. That HTTP endpoint is specified in your `prisma.yml`. - -With Prisma ORM 2, the HTTP layer isn't exposed any more and Prisma Client 2.0 is configured to run requests "directly" against the database (that is, requests are proxied by Prisma ORM's [query engine](/orm/more/under-the-hood/engines), but there isn't an extra server any more). - -So, as a next step you'll need to tell Prisma ORM 2 _what_ kind of database you use (MySQL or PostgreSQL) and _where_ it is located. - -First, you need to ensure that that `provider` field on the `datasource` block inside `schema.prisma` is configured to use the right database: - -- If you're using PostgreSQL, it needs to define the value `"postgresql"` in the `provider` field. -- If you're using MySQL, it needs to define the value `"mysql"` in the `provider` field. - -Switch around with the tabs in the code block to see examples of both: - - - - -```prisma -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} -``` - - - - -```prisma -datasource db { - provider = "mysql" - url = env("DATABASE_URL") -} -``` - - - - -With the `provider` field set, you can go ahead and configure the connection URL inside the `.env` file. - -Assume the database configuration in your Docker Compose file that you used to deploy your Prisma ORM server looks as follows: - -```yml file=docker-compose.yml showLineNumbers -PRISMA_CONFIG: | - port: 4466 - databases: - default: - connector: postgres - host: postgres - port: 5432 - user: prisma - password: prisma -``` - -Also assume your `endpoint` in `prisma.yml` is configured as follows: - -```yml file=prisma.yml -endpoint: http://localhost:4466/myproject/dev -``` - -Based on these connection details, you need to configure the `DATABASE_URL` environment variable inside your `.env` file as follows: - -```bash file=.env -DATABASE_URL="postgresql://janedoe:randompassword@localhost:5432/prisma?schema=myproject$dev" -``` - -Note that the `schema` argument is typically composed of your _service name_ and _service stage_ (which are part of the `endpoint` in `prisma.yml`), separated by the `$` character. - -Sometimes no service name and stage are specified in `prisma.yml`: - -```yml file=prisma.yml -endpoint: http://localhost:4466/ -``` - -In that case, the `schema` must be specified as follows: - -```bash file=.env -DATABASE_URL="postgresql://janedoe:randompassword@localhost:5432/prisma?schema=default$default" -``` - -Learn more on the [Connection URLs](/orm/reference/connection-urls) page. - -## 4. Introspect your database - -For the purpose of this guide, we'll use the following Prisma 1 data model (select the **SQL** tab below to see what the data model maps to in SQL): - - - - -```graphql -type User { - id: ID! @id - email: String @unique - name: String! - role: Role! @default(value: CUSTOMER) - jsonData: Json - profile: Profile - posts: [Post!]! -} - -type Post { - id: ID! @id - createdAt: DateTime! @createdAt - updatedAt: DateTime! @updatedAt - title: String! - content: String - published: Boolean! @default(value: false) - author: User @relation(link: TABLE) - categories: [Category!]! -} - -type Profile { - id: ID! @id - bio: String - user: User! @relation(link: INLINE) -} - -type Category { - id: ID! @id - name: String! - posts: [Post!]! -} - -enum Role { - ADMIN - CUSTOMER -} -``` - - - - -```sql -CREATE TABLE"User" ( - id character varying(25) PRIMARY KEY, - email text, - name text NOT NULL, - role text NOT NULL, - "jsonData" text -); -CREATE UNIQUE INDEX "User_pkey" ON"User"(id text_ops); -CREATE UNIQUE INDEX "default$default.User.email._UNIQUE" ON"User"(email text_ops); - -CREATE TABLE"Post" ( - id character varying(25) PRIMARY KEY, - title text NOT NULL, - published boolean NOT NULL, - "createdAt" timestamp(3) without time zone NOT NULL, - "updatedAt" timestamp(3) without time zone NOT NULL, - content text -); -CREATE UNIQUE INDEX "Post_pkey" ON"Post"(id text_ops); - -CREATE TABLE"Profile" ( - id character varying(25) PRIMARY KEY, - bio text, - user character varying(25) REFERENCES"User"(id) ON DELETE SET NULL -); -CREATE UNIQUE INDEX "Profile_pkey" ON"Profile"(id text_ops); - -CREATE TABLE"Category" ( - id character varying(25) PRIMARY KEY, - name text NOT NULL -); -CREATE UNIQUE INDEX "Category_pkey" ON"Category"(id text_ops); - -CREATE TABLE"_PostToUser" ( - "A" character varying(25) NOT NULL REFERENCES"Post"(id) ON DELETE CASCADE, - "B" character varying(25) NOT NULL REFERENCES"User"(id) ON DELETE CASCADE -); -CREATE UNIQUE INDEX "_PostToUser_AB_unique" ON"_PostToUser"("A" text_ops,"B" text_ops); -CREATE INDEX "_PostToUser_B" ON"_PostToUser"("B" text_ops); - -CREATE TABLE"_CategoryToPost" ( - "A" character varying(25) NOT NULL REFERENCES"Category"(id) ON DELETE CASCADE, - "B" character varying(25) NOT NULL REFERENCES"Post"(id) ON DELETE CASCADE -); -CREATE UNIQUE INDEX "_CategoryToPost_AB_unique" ON"_CategoryToPost"("A" text_ops,"B" text_ops); -CREATE INDEX "_CategoryToPost_B" ON"_CategoryToPost"("B" text_ops); -``` - - - - -Note that this data model has three [relations](/orm/prisma-schema/data-model/relations): - -- 1-1: `User` ↔ `Profile` -- 1-n: `User` ↔ `Post` (maintained via the `_PostToUser` relation table) -- m-n: `Post` ↔ `Category` (maintained via the `_CategoryToPost` relation table) - -Now you can run Prisma ORM's introspection against your database with the following command: - -```terminal copy -npx prisma db pull -``` - -Here's a graphical illustration for what happens when `db pull` is invoked: - -![Introspect your database](/img/orm/prisma-db-pull-generate-schema.png) - -For the above Prisma 1 datamodel, this results in the following Prisma ORM 2 schema (note that the models have been reordered to match the initial order of the Prisma 1 datamodel): - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id @default(cuid()) - email String? @unique - name String - role String - jsonData String? - Profile Profile[] - Post Post[] -} - -model Post { - id String @id @default(cuid()) - createdAt DateTime - updatedAt DateTime - title String - content String? - published Boolean - Category Category[] - User User[] -} - -model Profile { - id String @id @default(cuid()) - bio String? - user String? @unique - User User? @relation(fields: [user], references: [id]) -} - -model Category { - id String @id @default(cuid()) - name String - Post Post[] -} -``` - -While this is already a valid Prisma ORM 2 schema, it lacks a number of _features_ that were part of its Prisma 1 equivalent: - -- no auto-generated date values for the `createdAt` and `updatedAt` fields on `Post` -- no default value for the `role` field on `User` -- no default value for the `published` field on `Post` - -There further are a number of inconsistencies which result in a less idiomatic/ergonomic Prisma Client API: - -- `User` ↔ `Profile` is a 1-n instead of 1-1 relation -- `User` ↔ `Post` is a m-n instead of 1-n relation -- relation fields are uppercased (e.g. `Profile` and `Post` on `User`) -- the `jsonData` field on `User` is of type `String` instead of `Json` -- the `role` field on `User` is of type `String` instead of `Role`, the `enum` definition for role is missing altogether - -While these inconsistencies don't actually impact the "feature set" you'll have available in your Prisma Client API, they make you lose certain constraints/guarantees that were present before. - -For example, Prisma ORM now won't guarantee that a `User` is connected to _at most_ one `Profile` because the relation between the tables was recognized as 1-n during introspection, so one `User` record _could_ now get connected to multiple `Profile` records. - -Another issue is that you can store whatever text for the `jsonData` and `role` fields, regardless of whether it's valid JSON or represents a value of the `Role` enum. - -To learn more about these inconsistencies check out the [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) page. - -In the following, we'll go through these incompatibilities and fix them one by one using the Prisma schema upgrade CLI. - -## 5. Use the Prisma schema upgrade CLI to resolve schema incompatibilities - -The [Prisma 1 Upgrade CLI](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#prisma-1-upgrade-cli) is an interactive tool that helps you upgrading your Prisma schema and ironing out most of the inconsistencies listed above. - -The Prisma 1 Upgrade CLI works in two major phases: - -1. Fix the database schema via plain SQL -1. Add missing attributes to the Prisma ORM 2 schema and other schema fixes - -During the first phase, it will generate and print a number of SQL statements that you should run against your database to adjust the database schema. You can either run all of the statements or a subset of them before continuing to the second phase. - -During the second phase, you don't need to do anything manually. The Upgrade CLI will make changes to your Prisma schema by adding certain Prisma ORM-level attributes (like `@default(cuid))` or `@updatedAt`), adjusting the names of relation fields to match the ones from your Prisma 1 datamodel and ensure 1-1-relations that were required on both sides in your Prisma 1 datamodel are also required in the Prisma ORM 2 schema. - -Note that **you can start over at any time during the process** and go back from the second to the first phase. - -In this illustration, the green area shows the first phase, the blue area shows the second phase. Note that you can optionally run `prisma db pull` in between the phases to update your Prisma ORM data model: - -![Fixing the schema incompatibilities](./images/fix-schema-incompatibilities.png) - -To use the Upgrade CLI, you can either install it locally in your project, or invoke it once without installation using `npx` as done here: - -```terminal copy -npx prisma-upgrade prisma1/prisma.yml prisma/schema.prisma -``` - -The CLI will greet you with the following message: - -```no-lines wrap -◮ Welcome to the interactive Prisma Upgrade CLI that helps with the -upgrade process from Prisma 1 to Prisma ORM 2. - -Please read the docs to learn more about the upgrade process: -https://pris.ly/d/how-to-upgrade - -➤ Goal -The Upgrade CLI helps you resolve the schema incompatibilities -between Prisma 1 and Prisma ORM 2. Learn more in the docs: -https://pris.ly/d/schema-incompatibilities - -➤ How it works -Throughout the process, you'll need to adjust your database schema by sending -SQL statements to it. The SQL statements are provided by the Upgrade CLI. - -Note that the Upgrade CLI never makes changes to your database, -you are in full control over any operations that are executed against it. - -You can stop and re-run the Upgrade CLI at any time. - -These are the different steps of the upgrade process: - - 1. The Upgrade CLI generates SQL commands for you to run on your database. - 2. You run the SQL commands against your database. - 3. You run the `npx prisma db pull` command again. - 4. You run the `npx prisma-upgrade` command again. - 5. The Upgrade CLI adjusts the Prisma ORM 2 schema by adding missing attributes. - -➤ Note -It is recommended that you make a full backup of your existing data before starting -the upgrade process. If possible, the migration should be performed in a staging -environment before executed against a production environment. - -➤ Help -If you have any questions or run into any problems along the way, -please create an issue at: -https://github.com/prisma/prisma1-upgrade/issues - -Are you ready? [Y/n] -``` - -Press the Y button, then confirm by hitting RETURN on your keyboard to continue. - -Once you confirmed, the CLI outputs the SQL statements you should be running against your database: - -```no-lines wrap -➤ Adjust your database schema -Run the following SQL statements against your database: - - Fix columns with ENUM data types - https://pris.ly/d/schema-incompatibilities#enums-are-represented-as-text-in-database - - CREATE TYPE "default$default"."Role" AS ENUM ('ADMIN', 'CUSTOMER'); - ALTER TABLE "default$default"."User" ALTER COLUMN "role" SET DATA TYPE "default$default"."Role" using "role"::"default$default"."Role"; - - - Add missing `DEFAULT` constraints to the database - https://pris.ly/d/schema-incompatibilities#default-values-arent-represented-in-database - - ALTER TABLE "default$default"."User" ALTER COLUMN "role" SET DEFAULT 'CUSTOMER'; - ALTER TABLE "default$default"."Post" ALTER COLUMN "published" SET DEFAULT false; - - - Fix columns with JSON data types - https://pris.ly/d/schema-incompatibilities#json-type-is-represented-as-text-in-database - - ALTER TABLE "default$default"."User" ALTER COLUMN "jsonData" SET DATA TYPE JSONB USING "jsonData"::TEXT::JSONB; - - - Replicate `@createdAt` behavior in Prisma ORM 2 - https://pris.ly/d/schema-incompatibilities#createdat-isnt-represented-in-database - - ALTER TABLE "default$default"."Post" ALTER COLUMN "createdAt" SET DEFAULT CURRENT_TIMESTAMP; - - - Fix 1-1 relations by adding `UNIQUE` constraints - https://pris.ly/d/schema-incompatibilities#inline-1-1-relations-are-recognized-as-1-n-missing-unique-constraint - - ALTER TABLE "default$default"."Profile" ADD UNIQUE ("user"); - - - Migrate IDs from varchar(25) to varchar(30) - https://pris.ly/d/schema-incompatibilities#mismatching-cuid-length - - ALTER TABLE "default$default"."Category" ALTER COLUMN "id" SET DATA TYPE character varying(30); - ALTER TABLE "default$default"."Post" ALTER COLUMN "id" SET DATA TYPE character varying(30); - ALTER TABLE "default$default"."Profile" ALTER COLUMN "id" SET DATA TYPE character varying(30); - ALTER TABLE "default$default"."Profile" ALTER COLUMN "user" SET DATA TYPE character varying(30); - ALTER TABLE "default$default"."User" ALTER COLUMN "id" SET DATA TYPE character varying(30); - -➤ Breaking changes detected - -In order to fully optimize your database schema, you'll need to run a few SQL -statements that can break your Prisma 1 setup. Note that these changes are optional -and if you are upgrading gradually and running Prisma 1 and Prisma ORM 2 side-by-side, -you should not perform these changes yet. Instead, you can perform them whenever -you are ready to completely remove Prisma 1 from your project. -If you are upgrading all at once, you can safely perform these changes now. - -Learn more in the docs: -https://pris.ly/d/how-to-upgrade' -``` - -> **Note**: If you're seeing the note about breaking changes, you can ignore it for now. We'll discuss it later. - -The shown SQL statements are categorized into a number of "buckets", all aiming to resolve a certain [schema incompatibility](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql): - -- Fix columns with ENUM data types -- Add missing `DEFAULT` constraints to the database -- Fix columns with JSON data types -- Replicate `@createdAt` behavior in Prisma 2 -- Fix 1-1 relations by adding `UNIQUE` constraints - -As a next step, you can start sending the SQL statements to your database. Note that all of these changes are non-breaking and you'll be able to continue using Prisma 1 side-by-side with Prisma ORM 2. - -The next sections cover the different kinds of SQL statements to be sent to your database individually. - -### 5.1. Fix the database schema via plain SQL (non-breaking) - -In this section, we'll walk through the printed SQL statements and run them against the database one by one. - -### 5.1.1. Fix columns with ENUM data types - -The first thing the tool does is help you ensure that `enum` definitions in your Prisma 1 datamodel will be represented as actual `ENUM` types in the underlying database, right now they are represented as plain strings (e.g. as `MEDIUMTEXT` in MySQL). - -The CLI currently shows the following output: - -```no-lines wrap -Fix columns with ENUM data types -https://pris.ly/d/schema-incompatibilities#enums-are-represented-as-text-in-database - - CREATE TYPE "default$default"."Role" AS ENUM ('ADMIN', 'CUSTOMER'); - ALTER TABLE "default$default"."User" ALTER COLUMN "role" SET DATA TYPE "default$default"."Role" using "role"::"default$default"."Role"; -``` - -> **⚠️ Warning**: If you are running Prisma 1 and Prisma ORM 2 [side-by-side](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#upgrade-strategies), these [SQL statements will break your Prisma 1 setup](https://github.com/prisma/prisma1-upgrade/issues/74). The docs will be updated to reflect this soon. - -Go ahead and run these statements against your database now. - -![Altering columns to use ENUM with SQL](./images/altering-columns-to-use-enum.png) - -### 5.1.2. Add missing `DEFAULT` constraints to the database - -Next, the Upgrade CLI helps you resolve the issue that [default values aren't represented in the database](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql#default-values-arent-represented-in-database) by generating SQL statements that add the respective `DEFAULT` constraints directly to the database. - -In this case, two `DEFAULT` constraints are missing which are suggested by the tool: - -```no-lines wrap -Add missing `DEFAULT` constraints to the database -https://pris.ly/d/schema-incompatibilities#default-values-arent-represented-in-database - - ALTER TABLE "default$default"."User" ALTER COLUMN "role" SET DEFAULT 'CUSTOMER'; - ALTER TABLE "default$default"."Post" ALTER COLUMN "published" SET DEFAULT false; -``` - -You can now run these SQL statements against your database either using a command line client or a GUI like Postico: - -![Adding missing `DEFAULT` constraints to columns](./images/add-missing-default-constraints-to-columns.png) - -### 5.1.3. Fix columns with JSON data types - -Next, the tool helps you ensure that `Json` fields in your Prisma 1 datamodel will be represented as `JSON` columns in the underlying database, right now they are represented as plain strings (e.g. as `MEDIUMTEXT` in MySQL). - -Changing the column type to `JSON` will ensure that the field is properly recognized as `Json` during Prisma ORM 2 introspection. - -The CLI currently shows the following output: - -```no-lines wrap -Fix columns with JSON data types -https://pris.ly/d/schema-incompatibilities#json-type-is-represented-as-text-in-database - - ALTER TABLE "default$default"."User" ALTER COLUMN "jsonData" TYPE JSON USING "jsonData"::json; -``` - -> **⚠️ Warning**: If you are running Prisma 1 and Prisma ORM 2 [side-by-side](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#upgrade-strategies), these [SQL statements will break your Prisma 1 setup](https://github.com/prisma/prisma1-upgrade/issues/73). The docs will be updated to reflect this soon. - -You can now run these SQL statements against your database either using a command line client or a GUI like Postico: - -![Adding missing `DEFAULT` constraints to columns](./images/fix-columns-with-json-data-types.png) - - -### 5.1.4. Replicate `@createdAt` behavior in Prisma ORM 2 - -The next thing the tools does is help you resolve the issue that the behavior of [`@createdAt` isn't represented in database](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql#default-values-arent-represented-in-database) - -The CLI currently shows the following output: - -```no-lines wrap -Replicate `@createdAt` behavior in Prisma ORM 2.0 -https://pris.ly/d/schema-incompatibilities#createdat-isnt-represented-in-database - - ALTER TABLE "default$default"."Post" ALTER COLUMN "createdAt" SET DEFAULT CURRENT_TIMESTAMP; -``` - -You can now run these SQL statements against your database either using a command line client or a GUI like Postico: - -![Running an SQL command to alter a column](./images/run-sql-command-to-alter-column.png) - -### 5.1.5. Fix 1-1 relations by adding `UNIQUE` constraints - -Now, the tool will help you [turn the current 1-n relation between `User` ↔ `Profile` back into a 1-1 relation](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql#inline-1-1-relations-are-recognized-as-1-n-missing-unique-constraint) by adding a `UNIQUE` constraint to the foreign key column called `user` (named after the relation field in the Prisma 1 datamodel) in the database. - -The CLI currently shows the following output: - -```no-lines wrap -Fix 1-1 relations by adding `UNIQUE` constraints -https://pris.ly/d/schema-incompatibilities#inline-1-1-relations-are-recognized-as-1-n-missing-unique-constraint - - ALTER TABLE "default$default"."Profile" ADD UNIQUE ("user"); -``` - -You can now run these SQL statements against your database either using a command line client or a GUI like Postico: - -![Running an SQL command to alter a column](./images/run-sql-command-to-alter-column.png) - -### 5.1.6. Fix mismatch of CUID length - -> **Note**: These SQL statements will keep appearing in the Upgrade CLI even after you have changed the column types in the underlying database. This is a currently a limitation in the Upgrade CLI. - -Finally, the tool will help you [turn the current ID columns of type `VARCHAR(25)` into `VARCHAR(30)`](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql#mismatching-cuid-length) by adding a `UNIQUE` constraint to the foreign key column called `user` (named after the relation field in the Prisma 1 datamodel) in the database. - -The CLI currently shows the following output: - -```no-lines wrap wrap -Migrate IDs from varchar(25) to varchar(30) -https://pris.ly/d/schema-incompatibilities#mismatching-cuid-length - - ALTER TABLE "default$default"."Category" ALTER COLUMN "id" SET DATA TYPE character varying(30); - ALTER TABLE "default$default"."Post" ALTER COLUMN "id" SET DATA TYPE character varying(30); - ALTER TABLE "default$default"."Profile" ALTER COLUMN "id" SET DATA TYPE character varying(30); - ALTER TABLE "default$default"."Profile" ALTER COLUMN "user" SET DATA TYPE character varying(30); - ALTER TABLE "default$default"."User" ALTER COLUMN "id" SET DATA TYPE character varying(30); -``` - -You can now run these SQL statements against your database either using a command line client or a GUI like Postico: - -![Running an SQL command to alter a column](./images/run-sql-command-to-alter-column.png) - -### 5.1.7. Breaking changes detected - -In case the Upgrade CLI has printed a note about breaking changes, your database schema needs some adjustments that will break Prisma 1 compatibility in order to be fully optimized. - -If there are no breaking changes detected, you can [skip forward to section 5.2](#52-re-introspect-your-database-to-update-your-prisma-schema) - -Depending on your [upgrade strategy](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#upgrade-strategies), you can either perform these changes now or skip to the next phase of the Upgrade CLI: - -- If you are following the gradual side-by-side upgrade strategy, do not perform these changes yet since they will break your Prisma 1 setup. In that case, you can continue to the next phase of the Upgrade CLI by typing n and hitting RETURN. -- If you are following the all at once upgrade strategy, you can perform these changes now. In that case, continue by typing Y and hitting RETURN. - -### 5.2. Fix the database schema via plain SQL (breaking) - -In this section, you'll resolve the schema incompatibilities that are breaking your Prisma 1 setup. Do not perform these changes if you are still running Prisma 1 in your project! - -### 5.2.1. Fix incorrect m-n relations - -Now, the Upgrade CLI helps you fix all 1-1 and 1-n relations that Prisma 1 represents with relation tables and that [currently only exist as m-n relations](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql#all-non-inline-relations-are-recognized-as-m-n) in your new Prisma ORM 2 schema. Concretely, this is the case for the `User` ↔ `Post` relation which currently is defined as m-n but _should_ really be a 1-n relation. - -To fix this, you'll need to perform the following migration: - -1. Create a new foreign key column on `Post` to link directly to the `User` table. -1. Migrate the foreign key values from the relation table into the new foreign key column on `Post`. -1. Delete the relation table. - -These instructions are now printed by the CLI: - -```no-lines wrap -➤ Adjust your database schema -Run the following SQL statements against your database: - - Fix one-to-many table relations - https://pris.ly/d/schema-incompatibilities#all-non-inline-relations-are-recognized-as-m-n - - ALTER TABLE "default$default"."Post" ADD COLUMN "authorId" character varying(25) ; - ALTER TABLE "default$default"."Post" ADD CONSTRAINT "author" FOREIGN KEY ("authorId") REFERENCES "default$default"."User"("id"); - UPDATE "default$default"."Post" SET "authorId" = "default$default"."_PostToUser"."B" FROM "default$default"."_PostToUser" WHERE "default$default"."_PostToUser"."A" = "default$default"."Post"."id"; - DROP TABLE "default$default"."_PostToUser"; - - -➤ Next Steps - -After you executed one or more of the previous SQL statements against your database, -please run the following two commands to refresh your Prisma ORM 2 schema and check -the changes. - - 1. Run `npx prisma db pull` again to refresh your Prisma ORM 2 schema. - 2. Run `npx prisma-upgrade` again. - -If you can't or don't want to execute the remaining SQL statements right now, you can -skip to the last step where the Upgrade CLI adds missing attributes to your Prisma ORM 2 -schema that are not picked up by introspection. - -Skip to the last step? [Y/n]? -``` - -For this fix, you'll need to run three SQL statements: - -1. Create new column `authorId` on the `Post` table. This column should be a _foreign key_ that references the `id` field of the `User` table: - ```sql no-lines - ALTER TABLE `Post` ADD COLUMN `authorId` VARCHAR(25); - ALTER TABLE `Post` ADD FOREIGN KEY (`authorId`) REFERENCES `User` (`id`); - ``` -1. Write a SQL query that reads all the rows from the `_PostToUser` relation table and for each row: - 1. Finds the respective `Post` record by looking up the value from column `A` - 1. Inserts the value from column `B` as the value for `authorId` into that `Post` record - ```sql no-lines - UPDATE Post, _PostToUser - SET Post.authorId = _PostToUser.B - WHERE Post.id = _PostToUser.A - ``` -1. Delete the `_PostToUser` relation table - ```sql no-lines - DROP TABLE `_PostToUser`; - ``` - -![Fixing incorrect m-n relations with SQL](./images/fix-incorrect-m-n-relations-sql.png) - -After these commands, the user ID values of the records from column `B` of the relation table are migrated to the new `authorId` column. - -### 5.2. Re-introspect your database to update your Prisma schema - -At this point, you've resolved the schema incompatibilities with the Upgrade CLI. You can now exit the Upgrade CLI for now by typing n and hitting RETURN. - -In this section, you'll update your Prisma schema with another introspection round. This time, the previous flaws of the Prisma schema will be resolved because the database schema has been adjusted: - -```terminal copy -npx prisma db pull -``` - -This time, the resulting Prisma schema looks as follows: - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id - name String - email String? @unique - jsonData Json? - role Role @default(CUSTOMER) - Post Post[] - Profile Profile? -} - -model Post { - id String @id - createdAt DateTime @default(now()) - updatedAt DateTime - title String - content String? - published Boolean @default(false) - authorId String? - User User? @relation(fields: [authorId], references: [id]) - Category Category[] @relation(references: [id]) -} - -model Category { - id String @id - name String - Post Post[] @relation(references: [id]) -} - -model Profile { - bio String? - id String @id - user String? @unique - User User? @relation(fields: [user], references: [id]) -} - -enum Role { - ADMIN - CUSTOMER -} -``` - -This schema has most issues resolved, but it still lacks the following: - -### 5.2. Add missing attributes to the Prisma 2 schema and other schema fixes - -The CLI now prints the following: - -``` wrap -➤ What happens next -As a last step, some final adjustments will be made to your Prisma ORM 2 schema -to carry over some Prisma ORM-level attributes that aren't picked up by introspection. - -As a last step, some final adjustments will be made to your Prisma ORM 2.0 -schema to carry over some Prisma ORM-level attributes that aren't picked -up by introspection. - -Warning -Your current Prisma ORM 2.0 schema will be overwritten, so please -make sure you have a backup! - -Are you ready? [Y/n] -``` - -At this point, you either ran all the SQL statement that were printed by the CLI or you skipped some of them. Either way, you can now move on the last step and let the Upgrade CLI add the missing Prisma ORM 2 attributes. Typically these are the following: - -- `@default(cuid())` for your `@id` fields -- `@updatedAt` for any fields that were using this attribute in Prisma 1 -- `@map` and `@@map` as replacements for `@db` and `@@db` from Prisma 1 - -In that step, the Upgrade CLI also fixes other issues that occurred in the transition to Prisma ORM 2: - -- it makes sure that 1-1-relations that were required on both sides in Prisma 1 are also required in your Prisma ORM 2 schema -- it renames relation fields to the same names they had in your Prisma 1 datamodel ([coming soon](https://github.com/prisma/prisma1-upgrade/issues/25)) - -To apply these changes, you can re-run the Upgrade CLI: - -```terminal copy -npx prisma-upgrade prisma1/prisma.yml prisma/schema.prisma -``` - -If you did not resolve all schema incompatibilities, the Upgrade CLI now prints the remaining SQL statements (as well as the ones for migrating IDs). You can just ignore them at this point and continue to the last step by continuously typing Y and hitting RETURN when prompted. - -If you did resolve all schema incompatibilities, no SQL statements will be printed and the Upgrade CLI only outputs the following: - -```no-lines wrap -$ npx prisma-upgrade prisma1/prisma.yml prisma/schema.prisma - -➤ Next Steps - -After you executed one or more of the previous SQL statements against your database, -please run the following two commands to refresh your Prisma ORM 2 schema and check -the changes. - - 1. Run `npx prisma db pull` again to refresh your Prisma ORM 2 schema. - 2. Run `npx prisma-upgrade` again. - -If you can't or don't want to execute the remaining SQL statements right now, you can -skip to the last step where the Upgrade CLI adds missing attributes to your Prisma ORM 2 -schema that are not picked up by introspection. - -Skip to the last step? [Y/n]? -``` - -One more time, type Y and hit RETURN to confirm. - -The final prompt of the Upgrade CLI now asks you to confirm the above mentioned changes it will make to your Prisma schema: - -```no-lines wrap -➤ What happens next -As a last step, some final adjustments will be made to your Prisma ORM 2 schema -to carry over some Prisma ORM-level attributes that aren't picked up by introspection. - -As a last step, some final adjustments will be made to your Prisma ORM 2.0 -schema to carry over some Prisma ORM-level attributes that aren't picked -up by introspection. - -Warning -Your current Prisma ORM 2.0 schema will be overwritten, so please -make sure you have a backup! - -Are you ready? [Y/n] -``` - -One last time, type Y and hit RETURN to confirm. - -This is the final output of the Upgrade CLI: - -```no-lines -Updating prisma/schema.prisma... -Done updating prisma/schema.prisma! - -✔ Congratulations, you're all set! - -➤ Note -If you didn't execute all generated SQL commands against your database, -you can re-run the Upgrade CLI at any time. - -Note that the Upgrade CLI doesn't resolve all of the schema incompatibilities -between Prisma 1 and Prisma ORM 2. If you want to resolve the remaining ones, -you can do so manually by following this guide: -https://pris.ly/d/upgrading-the-prisma-layer - -➤ Next steps -Otherwise you can continue your upgrade process by installing Prisma Client 2: -npm install @prisma/client - -You can find guides for different upgrade scenarios in the docs: -https://pris.ly/d/upgrade-from-prisma-1 -``` - -### 5.3. Final result - -The final version of the Prisma schema should look as follows: - -```prisma file=schema.prisma showLineNumbers -model User { - id String @id @default(cuid()) - name String - email String? @unique - jsonData Json? - role Role @default(CUSTOMER) - Post Post[] - Profile Profile? -} - -model Post { - id String @id @default(cuid()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - title String - content String? - published Boolean @default(false) - authorId String? - User User? @relation(fields: [authorId], references: [id]) - Category Category[] @relation(references: [id]) -} - -model Profile { - id String @id @default(cuid()) - bio String? - user String? @unique - User User? @relation(fields: [user], references: [id]) -} - -model Category { - id String @id @default(cuid()) - name String - Post Post[] @relation(references: [id]) -} - -enum Role { - ADMIN - CUSTOMER -} -``` - -### 5.4. Rename relation fields - -One thing you'll notice with this version of the Prisma ORM 2 schema is that all [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are named after their respective models, e.g: - -```prisma file=schema.prisma showLineNumbers -model User { - Post Post[] - Profile Profile? -} - -model Post { - User User? @relation(fields: [authorId], references: [id]) - Category Category[] @relation(references: [id]) -} - -model Profile { - User User? @relation(fields: [user], references: [id]) -} - -model Category { - Post Post[] @relation(references: [id]) -} -``` - -This is not ideal and you can in fact manually rename all of them to their previous versions! - -Because all relation fields are _virtual_, meaning they don't _manifest_ in the database, you can name them whatever you like. In this case, all relation fields are lowercased and sometimes pluralized. - -Here's what they look like after the rename: - -```prisma file=schema.prisma showLineNumbers -model User { - posts Post[] - profile Profile? -} - -model Post { - author User? @relation(fields: [authorId], references: [id]) - categories Category[] @relation(references: [id]) -} - -model Profile { - user String? @unique - owner User? @relation(fields: [user], references: [id]) -} - -model Category { - posts Post[] @relation(references: [id]) -} -``` - -> **Note**: For the 1-1-relation between `User` and `Profile` it was not possible to set the old name `user` for the relation field. This is because there'd be a naming conflict with the already existing [relation scalar](/orm/prisma-schema/data-model/relations#annotated-relation-fields) field that holds the foreign key. In that case, you can choose a different name or alternatively rename the foreign key column directly in the database via SQL. - -### 5.5. Resolving remaining schema incompatibilities - -There are a few schema incompatibilities that were not yet resolved by the Upgrade CLI. At this point you still haven't fixed [scalar lists](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql#scalar-lists-arrays-are-maintained-with-extra-table). You can find the recommended workarounds for this and others on the [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) page. - -## 6. Install and generate Prisma Client - -Now that you have your Prisma ORM 2 schema ready, you can install Prisma Client with the following command: - -```terminal copy -npm install @prisma/client -``` - -## 7. Next steps - -Congratulations, you have now upgraded your Prisma ORM layer to Prisma ORM 2! From here on, you can move on to update your application code using one of the following guides: - -- [Old to new Nexus](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus): Choose this guide if you're currently running Prisma 1 with GraphQL Nexus. -- [prisma-binding to Nexus](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-nexus): Choose this guide if you're currently running Prisma 1 with `prisma-binding` and want to upgrade to [Nexus](https://nexusjs.org/) (and TypeScript). -- [prisma-binding to SDL-first](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-sdl-first): Choose this guide if you're currently running Prisma 1 with `prisma-binding` and want to upgrade to an [SDL-first](https://www.prisma.io/blog/the-problems-of-schema-first-graphql-development-x1mn4cb0tyl3) GraphQL server. -- [REST API](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-a-rest-api): Choose this guide if you're currently running Prisma 1 using Prisma Client 1 and are building a REST API. - -## Bonus: Prisma Client API comparison - -This section contains a high-level and side-by-side comparison of the Prisma Client APIs of Prisma 1 and Prisma ORM 2. For more details about the new Prisma Client API, you can explore the [Prisma Client](/orm/prisma-client) docs. - -### Reading single records - - - - - -```ts -const user = await prisma.user({ id: 1 }) -``` - - - - - -```ts -await prisma.user.findUnique({ - where: { id: 1 }, -}) -``` - - - - - -### Reading lists of records - - - - - -```ts -const user = await prisma.users() -``` - - - - - -```ts -await prisma.user.findMany() -``` - - - - - -### Filtering lists - - - - - -```ts -const users = await prisma.users({ - where: { - name: 'Alice', - }, -}) -``` - - - - - -```ts -await prisma.user.findMany({ - where: { - name: 'Alice', - }, -}) -``` - - - - - -### Paginating lists - - - - - -```ts -const posts = await prisma.posts({ - skip: 5, - first: 10, -}) -``` - - - - - -```ts -await prisma.user.findMany({ - skip: 5, - take: 10, -}) -``` - - - - - -> **Note**: You can learn more about the new pagination API in the respective [release notes](https://github.com/prisma/prisma/releases/tag/2.0.0-beta.7) or the [Pagination](/orm/prisma-client/queries/pagination) page in the docs. - -### Sorting lists - - - - - -```ts -await prisma.posts({ - orderBy: 'title_ASC', -}) -``` - - - - - -```ts -await prisma.posts({ - orderBy: { - title: 'asc', - }, -}) -``` - - - - - -### Creating records - - - - - -```ts -await prisma.createUser({ - name: 'Alice', -}) -``` - - - - - -```ts -await prisma.user.create({ - data: { - name: 'Alice', - }, -}) -``` - - - - - -### Updating records - - - - - -```ts -await prisma.updateUser({ - where: { id: 1 }, - data: { - name: 'James', - email: 'james@prisma.io', - }, -}) -``` - - - - - -```ts -await prisma.user.update({ - where: { id: 1 }, - data: { - name: 'James', - email: 'james@prisma.io', - }, -}) -``` - - - - - -### Deleting records - - - - - -```ts -await prisma.deleteUser({ id: 1 }) -``` - - - - - -```ts -await prisma.user.delete({ - where: { id: 1 }, -}) -``` - - - - - -### Selecting fields & loading relations - -In Prisma 1, the only ways to select specific fields and/or load relations of an object was by using the string-based `$fragment` and `$graphql` functions. With Prisma ORM 2, this is now done in a clean and type-safe manner using [`select`](/orm/prisma-client/queries/select-fields#select-specific-fields) and [`include`](/orm/prisma-client/queries/select-fields#return-nested-objects-by-selecting-relation-fields). - -Another benefit of this approach is that you can use `select` and `include` on _any_ Prisma Client query, e.g. `findUnique()`, `findMany`, `create`, `update`, `delete`, ... - - - - - -```ts -await prisma.user({ id: 1 }).$fragment(` - fragment NameAndEmail on User { id email }` -`) -``` - - - - - -```ts -await prisma.user.findUnique({ - where: { id: 1 }, - select: { - id: true, - email: true, - }, -}) -``` - - - - - -As an example, creating a new record and only retrieving the `id` in the returned object was not possible in Prisma 1. With Prisma ORM 2 you can achieve this as follows: - -```ts -await prisma.user.create({ - data: { - name: 'Alice', - }, - select: { - id: true, - }, -}) -``` diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/04-upgrading-nexus-prisma-to-nexus.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/04-upgrading-nexus-prisma-to-nexus.mdx deleted file mode 100644 index 2aa82507b3..0000000000 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/04-upgrading-nexus-prisma-to-nexus.mdx +++ /dev/null @@ -1,774 +0,0 @@ ---- -title: 'Old to new Nexus' -metaTitle: 'Upgrade Prisma 1 with nexus-prisma to @nexus/schema' -metaDescription: 'Learn how to upgrade existing Prisma 1 projects with nexus-prisma to Prisma ORM 2 and Nexus.' ---- - -## Overview - -> **Note**: This guide is not fully up-to-date as it currently uses the [deprecated](https://github.com/graphql-nexus/nexus-plugin-prisma/issues/1039) version of the [`nexus-plugin-prisma`](https://github.com/graphql-nexus/nexus-plugin-prisma). While this is still functional, it is recommended to use the new [`nexus-prisma`](https://github.com/graphql-nexus/nexus-prisma/) library or an alternative code-first GraphQL library like [Pothos](https://pothos-graphql.dev/) going forward. If you have any questions, feel free to share them on our [Discord](https://pris.ly/discord). - -This upgrade guide describes how to upgrade a project that's based on [Prisma 1](https://github.com/prisma/prisma1) and uses [`nexus`](https://www.npmjs.com/package/nexus) (< v0.12.0) or [`@nexus/schema`](https://github.com/graphql-nexus/nexus) together with [`nexus-prisma`](https://www.npmjs.com/package/nexus-prisma) (< v4.0.0) to implement a GraphQL server. - -The code will be upgraded to the latest version of `@nexus/schema`. Further, the `nexus-prisma` package will be replaced with the new [`nexus-plugin-prisma`](https://github.com/graphql-nexus/nexus-plugin-prisma). - -The guide assumes that you already went through the [guide for upgrading the Prisma ORM layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql). This means you already: - -- installed the Prisma ORM 2 CLI -- created your Prisma ORM 2 schema -- introspected your database and resolved potential [schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) -- installed and generated Prisma Client - -The guide further assumes that you have a file setup that looks similar to this: - -``` -. -├── README.md -├── package.json -├── prisma -│ └── schema.prisma -├── prisma1 -│ ├── datamodel.prisma -│ └── prisma.yml -└── src - ├── generated - │ ├── nexus-prisma - │ ├── nexus.ts - │ ├── prisma-client - │ └── schema.graphql - ├── types.ts - └── index.ts -``` - -The important parts are: - -- A folder called with `prisma` with your Prisma ORM 2 schema -- A folder called `src` with your application code - -If this is not what your project structure looks like, you'll need to adjust the instructions in the guide to match your own setup. - -## 1. Upgrade Nexus dependencies - -To get started, you can remove the old Nexus and Prisma 1 dependencies: - -```copy -npm uninstall nexus nexus-prisma prisma-client-lib prisma1 -``` - -Then, you can install the latest `@nexus/schema` dependency in your project: - -```copy -npm install @nexus/schema -``` - -Next, install the Prisma ORM plugin for Nexus which will allow you to expose Prisma ORM models in your GraphQL API (this is the new equivalent of the former `nexus-prisma` package): - -```copy -npm install nexus-plugin-prisma -``` - -The `nexus-plugin-prisma` dependency bundles all required Prisma ORM dependencies. You should therefore remove the dependencies that you added installed when you upgraded the Prisma ORM layer of your app: - -```copy -npm uninstall @prisma/cli @prisma/client -``` - -Note however that you can still invoke the Prisma ORM 2 CLI with the familiar command: - -```copy -npx prisma -v -``` - -> **Note**: If you see the output of the Prisma 1 CLI when running `npx prisma -v`, be sure to delete your `node_modules` folder and re-run `npm install`. - -## 2. Update the configuration of Nexus and Prisma ORM - -To get started, you can remove the old imports that are not needed any more with your new setup: - -```ts line-number highlight=1-3;delete -//delete-start -import { makePrismaSchema, prismaObjectType } from 'nexus-prisma' -import datamodelInfo from './generated/nexus-prisma' -import { prisma } from './generated/prisma-client' -//delete-end -``` - -Instead, you now import the following into your application: - -```ts line-number highlight=1-3;add -//add-start -import { nexusSchemaPrisma } from 'nexus-plugin-prisma/schema' -import { objectType, makeSchema, queryType, mutationType } from '@nexus/schema' -import { PrismaClient } from '@prisma/client' -//add-end -``` - -Next you need to adjust the code where you currently create your `GraphQLSchema`, most likely this is currently happening via the `makePrismaSchema` function in your code. Since this function was imported from the removed `nexus-prisma` package, you'll need to replace it with the `makeSchema` function from the `@nexus/schema` package. The way how the Prisma ORM plugin for Nexus is used also changes in the latest version. - -Here's an example for such a configuration: - -```ts file=./src/index.ts line-number highlight=2,12-14;add|1,8-11;delete showLineNumbers -//delete-next-line - const schema = makePrismaSchema({ -//add-next-line - const schema = makeSchema({ - - // Provide all the GraphQL types we've implemented - types: [Query, Mutation, UserUniqueInput, User, Post, Category, Profile], - - // Configure the interface to Prisma - //delete-start - prisma: { - datamodelInfo, - client: prisma, - }, - //delete-end - //add-start - plugins: [nexusSchemaPrisma({ - experimentalCRUD: true, - })], - //add-end - - // Specify where Nexus should put the generated files - outputs: { - schema: path.join(__dirname, './generated/schema.graphql'), - typegen: path.join(__dirname, './generated/nexus.ts'), - }, - - // Configure nullability of input arguments: All arguments are non-nullable by default - nonNullDefaults: { - input: false, - output: false, - }, - - // Configure automatic type resolution for the TS representations of the associated types - typegenAutoConfig: { - sources: [ - { - source: path.join(__dirname, './types.ts'), - alias: 'types', - }, - ], - contextType: 'types.Context', - }, -}) -``` - -If you previously typed the GraphQL `context` object that's passed through your resolver chain, you need to adjust the type like so: - -```ts file=./src/types.ts highlight=2,6;add|1,5;delete showLineNumbers -//delete-next-line -import { Prisma } from './generated/prisma-client' -//add-next-line -import { PrismaClient } from '@prisma/client' - -export interface Context { - //delete-next-line - prisma: Prisma - //add-next-line - prisma: PrismaClient -} -``` - -## 3. Migrate your GraphQL types - -Here's a quick overview of the main differences between the two approaches of creating GraphQL types with the latest versions of `@nexus/schema` and `nexus-plugin-prisma`. - -- The `prismaObjectType` function is not available any more, all types are created with Nexus' `objectType` function. -- To expose Prisma models via Nexus, you can use the `t.model` property which is added to the `t` argument that's passed into Nexus' `definition` functions. `t.model` gives you access to the properties of a Prisma model and lets you expose them. -- Exposing CRUD operations for Prisma models via Nexus follows a similar approach. These are exposed via `t.crud` in the `definition` functions of your `queryType` and `mutationType` types. - -### 3.1. Migrating the `Post` type - -#### Type definition with the previous `nexus-prisma` package - -In the sample app, the `User` type is defined as follows: - -```ts -const User = prismaObjectType({ - name: 'User', - definition(t) { - t.prismaFields([ - 'id', - 'name', - 'email', - 'jsonData', - 'role' - { - name: 'posts', - args: [], // remove the arguments from the `posts` field of the `User` type in the Prisma schema - }, - ]) - }, -}) -``` - -#### Type definition with the latest version of `@nexus/schema` and the `nexus-plugin-prisma` - -With the latest version of `@nexus/schema`, you can now access the `objectType` function on your main `schema` instance and expose all fields from the Prisma model like so: - -```ts -const User = objectType({ - name: 'User', - definition(t) { - t.model.id() - t.model.name() - t.model.email() - t.model.jsonData() - t.model.role() - t.model.posts({ - pagination: false, - ordering: false, - filtering: false, - }) - t.model.profile() - }, -}) -``` - -Note that `t.model` looks at the `name` attribute in the object that's passed as an argument to the `objectType` function and matches it against the models in your Prisma schema. In this case, it's matched against the `User` model. Therefore, `t.model` exposes functions that are named after the fields of the `User` model. - -At this point, you might see errors on the relation fields `posts` and `profile`, e.g.: - -```bash highlight=1;delete -//delete-next-line -Missing type Post, did you forget to import a type to the root query? -``` - -This is because you didn't add the `Post` and `Profile` types to the GraphQL schema yet, the errors will go away once these types are part of the GraphQL schema as well! - -### 3.2. Migrating the `Post` type - -#### Type definition with the previous `nexus-prisma` package - -In the sample app, the `Post` type is defined as follows: - -```ts -const Post = prismaObjectType({ - name: 'Post', - definition(t) { - t.prismaFields(['*']) - }, -}) -``` - -The asterisk in `prismaFields` means that _all_ Prisma fields are exposed. - -#### Type definition with the latest version of `@nexus/schema` and the `nexus-plugin-prisma` - -With the latest version of `@nexus/schema`, you need to expose all fields explicitly, there's no option to just expose everything from a Prisma model. - -Therefore, the new definition of `Post` must explicitly list all its fields: - -```ts -const Post = objectType({ - name: 'Post', - definition(t) { - t.model.id() - t.model.title() - t.model.content() - t.model.published() - t.model.author() - t.model.categories() - }, -}) -``` - -Note that `t.model` looks at the `name` attribute and matches it against the models in your Prisma schema. In this case, it's matched against the `Post` model. Therefore, `t.model` exposes functions that are named after the fields of the `Post` model. - -### 3.3. Migrating the `Profile` type - -#### Type definition with the previous `nexus-prisma` package - -In the sample app, the `Profile` type is defined as follows: - -```ts -const Profile = prismaObjectType({ - name: 'Profile', - definition(t) { - t.prismaFields(['*']) - }, -}) -``` - -The asterisk in `prismaFields` means that _all_ Prisma fields are exposed. - -#### Type definition with the latest version of `@nexus/schema` and the `nexus-plugin-prisma` - -With the latest version of `@nexus/schema`, you need to expose all fields explicitly, there's no option to just expose everything from a Prisma model. - -Therefore, the new definition of `Profile` must explicitly list all its fields: - -```ts -const Profile = objectType({ - name: 'Profile', - definition(t) { - t.model.id() - t.model.bio() - t.model.user() - t.model.userId() - }, -}) -``` - -Note that `t.model` looks at the `name` attribute and matches it against the models in your Prisma schema. In this case, it's matched against the `Profile` model. Therefore, `t.model` exposes functions that are named after the fields of the `Profile` model. - -### 3.4. Migrating the `Category` type - -#### Type definition with the previous `nexus-prisma` package - -In the sample app, the `Category` type is defined as follows: - -```ts -const Category = prismaObjectType({ - name: 'Category', - definition(t) { - t.prismaFields(['*']) - }, -}) -``` - -The asterisk in `prismaFields` means that _all_ Prisma ORM fields are exposed. - -#### Type definition with the latest version of `@nexus/schema` and the `nexus-plugin-prisma` - -With the latest version of `@nexus/schema`, you need to expose all fields explicitly, there's no option to just expose everything from a Prisma model. - -Therefore, the new definition of `Category` must explicitly list all its fields: - -```ts -const Category = objectType({ - name: 'Category', - definition(t) { - t.model.id() - t.model.name() - t.model.posts({ - pagination: true, - ordering: true, - filtering: true, - }) - }, -}) -``` - -Note that `t.model` looks at the `name` attribute and matches it against the models in your Prisma schema. In this case, it's matched against the `Category` model. Therefore, `t.model` exposes functions that are named after the fields of the `Category` model. - -## 4. Migrate GraphQL operations - -As a next step, you can start migrating all the GraphQL _queries_ and _mutations_ from the "previous" GraphQL API to the new one. - -For this guide, the following sample GraphQL operations will be used: - -```graphql -input UserUniqueInput { - id: String - email: String -} - -type Query { - posts(searchString: String): [Post!]! - user(userUniqueInput: UserUniqueInput!): User - users(where: UserWhereInput, orderBy: Enumerable, skip: Int, after: String, before: String, first: Int, last: Int): [User]! -} - -type Mutation { - createUser(data: UserCreateInput!): User! - createDraft(title: String!, content: String, authorId: ID!): Post - updateBio(userUniqueInput: UserUniqueInput!, bio: String!): User - addPostToCategories(postId: String!, categoryIds: [String!]!): Post -} -``` - -### 4.1. Migrate GraphQL queries - -In this section, you'll migrate all GraphQL _queries_ from the previous version of `nexus` and `nexus-prisma` to the latest version of `@nexus/schema` and the `nexus-plugin-prisma`. - -#### 4.1.1. Migrate the `users` query - -In our sample API, the `users` query from the sample GraphQL schema is implemented as follows. - -```ts -const Query = prismaObjectType({ - name: 'Query', - definition(t) { - t.prismaFields(['users']) - }, -}) -``` - -To get the same behavior with the new Nexus, you need to call the `users` function on `t.crud`: - -```ts -schema.queryType({ - definition(t) { - t.crud.users({ - filtering: true, - ordering: true, - pagination: true, - }) - }, -}) -``` - -Recall that the `crud` property is added to `t` by the `nexus-plugin-prisma` (using the same mechanism as for `t.model`). - -#### 4.1.2. Migrate the `posts(searchString: String): [Post!]!` query - -In the sample API, the `posts` query is implemented as follows: - -```ts -queryType({ - definition(t) { - t.list.field('posts', { - type: 'Post', - args: { - searchString: stringArg({ nullable: true }), - }, - resolve: (parent, { searchString }, context) => { - return context.prisma.posts({ - where: { - OR: [ - { title_contains: searchString }, - { content_contains: searchString }, - ], - }, - }) - }, - }) - }, -}) -``` - -The only thing that needs to be updated for this query is the call to Prisma ORM since the new Prisma Client API looks a bit different from the one used in Prisma 1. - -```ts line-number highlight=6,9,12,13;normal -queryType({ - definition(t) { - t.list.field('posts', { - type: 'Post', - args: { - searchString: stringArg({ nullable: true }), - }, - resolve: (parent, { searchString }, context) => { - return context.prisma.post.findMany({ - where: { - OR: [ - { title: { contains: searchString } }, - { content: { contains: searchString } }, - ], - }, - }) - }, - }) - }, -}) -``` - -Notice that the `db` object is automatically attached to the `context` by the `nexus-plugin-prisma`. It represents an instance of your `PrismaClient` which enables you to send queries to your database inside your resolvers. - -#### 4.1.3. Migrate the `user(uniqueInput: UserUniqueInput): User` query - -In the sample API, the `user` query is implemented as follows: - -```ts -inputObjectType({ - name: 'UserUniqueInput', - definition(t) { - t.string('id') - t.string('email') - }, -}) - -queryType({ - definition(t) { - t.field('user', { - type: 'User', - args: { - userUniqueInput: schema.arg({ - type: 'UserUniqueInput', - nullable: false, - }), - }, - resolve: (_, args, context) => { - return context.prisma.user({ - id: args.userUniqueInput?.id, - email: args.userUniqueInput?.email, - }) - }, - }) - }, -}) -``` - -You now need to adjust the call to your `prisma` instance since the new Prisma Client API looks a bit different from the one used in Prisma 1. - -```ts line-number highlight=6,12-17;normal -const Query = queryType({ - definition(t) { - t.field('user', { - type: 'User', - args: { - //highlight-next-line - userUniqueInput: arg({ - type: 'UserUniqueInput', - nullable: false, - }), - }, - resolve: (_, args, context) => { - //highlight-start - return context.prisma.user.findUnique({ - where: { - id: args.userUniqueInput?.id, - email: args.userUniqueInput?.email, - }, - }) - //highlight-end - }, - }) - }, -}) -``` - -### 4.2. Migrate GraphQL mutations - -In this section, you'll migrate the GraphQL mutations from the sample schema to the latest versions of `@nexus/schema` and the `nexus-plugin-prisma`. - -#### 4.2.1. Migrate the `createUser` mutation - -In our sample API, the `createUser` mutation from the sample GraphQL schema is implemented as follows. - -```ts -const Mutation = prismaObjectType({ - name: 'Mutation', - definition(t) { - t.prismaFields(['createUser']) - }, -}) -``` - -To get the same behavior with the latest versions of `@nexus/schema` and the `nexus-plugin-prisma`, you need to call the `createOneUser` function on `t.crud` and pass an `alias` in order to rename the field in your GraphQL schema to `createUser` (otherwise it would be called `createOneUser`, after the function that's used): - -```ts -const Query = queryType({ - definition(t) { - t.crud.createOneUser({ - alias: 'createUser', - }) - }, -}) -``` - -Recall that the `crud` property is added to `t` by the `nexus-plugin-prisma` (using the same mechanism as for `t.model`). - -#### 4.2.2. Migrate the `createDraft(title: String!, content: String, authorId: String!): Post!` query - -In the sample app, the `createDraft` mutation implemented as follows. - -```ts line-number -mutationType({ - definition(t) { - t.field('createDraft', { - type: 'Post', - args: { - title: stringArg({ nullable: false }), - content: stringArg(), - authorId: stringArg({ nullable: false }), - }, - resolve: (_, args, context) => { - return context.prisma.createPost({ - title: args.title, - content: args.content, - author: { - connect: { id: args.authorId }, - }, - }) - }, - }) - }, -}) -``` - -You now need to adjust the call to your `prisma` instance since the new Prisma Client API looks a bit different from the one used in Prisma 1. - -```ts line-number highlight=11-19;normal -const Mutation = mutationType({ - definition(t) { - t.field('createDraft', { - type: 'Post', - args: { - title: stringArg({ nullable: false }), - content: stringArg(), - authorId: stringArg({ nullable: false }), - }, - resolve: (_, args, context) => { - //highlight-start - return context.prisma.post.create({ - data: { - title: args.title, - content: args.content, - author: { - connect: { id: args.authorId }, - }, - }, - }) - //highlight-end - }, - }) - }, -}) -``` - -#### 4.2.3. Migrate the `updateBio(bio: String, userUniqueInput: UserUniqueInput!): User` mutation - -In the sample API, the `updateBio` mutation is defined and implemented as follows. - -```ts -mutationType({ - definition(t) { - t.field('updateBio', { - type: 'User', - args: { - userUniqueInput: arg({ - type: 'UserUniqueInput', - nullable: false, - }), - bio: stringArg(), - }, - resolve: (_, args, context) => { - return context.prisma.updateUser({ - where: { - id: args.userUniqueInput?.id, - email: args.userUniqueInput?.email, - }, - data: { - profile: { - create: { bio: args.bio }, - }, - }, - }) - }, - }) - }, -}) -``` - -You now need to adjust the call to your `prisma` instance since the new Prisma Client API looks a bit different from the one used in Prisma 1. - -```ts highlight=13-23;normal -const Mutation = mutationType({ - definition(t) { - t.field('updateBio', { - type: 'User', - args: { - userUniqueInput: arg({ - type: 'UserUniqueInput', - nullable: false, - }), - bio: stringArg(), - }, - resolve: (_, args, context) => { - //highlight-start - return context.prisma.user.update({ - where: { - id: args.userUniqueInput?.id, - email: args.userUniqueInput?.email, - }, - data: { - profile: { - create: { bio: args.bio }, - }, - }, - }) - //highlight-end - }, - }) - }, -}) -``` - -#### 4.2.4. Migrate the `addPostToCategories(postId: String!, categoryIds: [String!]!): Post` mutation - -In the sample API, the `addPostToCategories` mutation is defined and implemented as follows. - -```ts line-number -mutationType({ - definition(t) { - t.field('addPostToCategories', { - type: 'Post', - args: { - postId: stringArg({ nullable: false }), - categoryIds: stringArg({ - list: true, - nullable: false, - }), - }, - resolve: (_, args, context) => { - const ids = args.categoryIds.map((id) => ({ id })) - return context.prisma.updatePost({ - where: { - id: args.postId, - }, - data: { - categories: { connect: ids }, - }, - }) - }, - }) - }, -}) -``` - -You now need to adjust the call to your `prisma` instance since the new Prisma Client API looks a bit different from the one used in Prisma 1. - -```ts line-number highlight=14-21;normal -const Mutation = mutationType({ - definition(t) { - t.field('addPostToCategories', { - type: 'Post', - args: { - postId: stringArg({ nullable: false }), - categoryIds: stringArg({ - list: true, - nullable: false, - }), - }, - resolve: (_, args, context) => { - const ids = args.categoryIds.map((id) => ({ id })) - //highlight-start - return context.prisma.post.update({ - where: { - id: args.postId, - }, - data: { - categories: { connect: ids }, - }, - }) - //highlight-end - }, - }) - }, -}) -``` - -## 5. Cleaning up - -### 5.1. Clean up npm dependencies - -If you haven't already, you can now uninstall dependencies that were related to the Prisma 1 setup: - -``` -npm uninstall prisma1 prisma-client-lib -``` - -### 5.2. Delete unused files - -Next, delete the files of your Prisma 1 setup: - -``` -rm -rf src/generated -rm -rf prisma1 -``` - -### 5.3. Stop the Prisma ORM server - -Finally, you can stop running your Prisma ORM server. diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/05-upgrading-prisma-binding-to-nexus.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/05-upgrading-prisma-binding-to-nexus.mdx deleted file mode 100644 index ca0b8a74a9..0000000000 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/05-upgrading-prisma-binding-to-nexus.mdx +++ /dev/null @@ -1,1329 +0,0 @@ ---- -title: 'prisma-binding to Nexus' -metaTitle: 'Upgrading from Prisma 1 with prisma-binding to Nexus' -metaDescription: 'Learn how to upgrade existing Prisma 1 projects with prisma-binding to Prisma ORM 2.0 and Nexus.' ---- - -## Overview - -> **Note**: This guide is not fully up-to-date as it currently uses the [deprecated](https://github.com/graphql-nexus/nexus-plugin-prisma/issues/1039) version of the [`nexus-plugin-prisma`](https://github.com/graphql-nexus/nexus-plugin-prisma). While this is still functional, it is recommended to use the new [`nexus-prisma`](https://github.com/graphql-nexus/nexus-prisma) library or an alternative code-first GraphQL library like [Pothos](https://pothos-graphql.dev/) going forward. If you have any questions, join us on our [Discord](https://pris.ly/discord). - -This upgrade guide describes how to migrate a Node.js project that's based on [Prisma 1](https://github.com/prisma/prisma1) and uses `prisma-binding` to implement a GraphQL server. - -The code will be migrated to [`@nexus/schema`](https://github.com/graphql-nexus/nexus) and the [`nexus-plugin-prisma`](https://github.com/graphql-nexus/nexus-plugin-prisma). As opposed to the _SDL-first_ approach that's used with `prisma-binding`, Nexus follows a code-first approach to construct GraphQL schemas. You can learn about the main differences of these two approaches in this [article](https://www.prisma.io/blog/the-problems-of-schema-first-graphql-development-x1mn4cb0tyl3). If you want to continue using the SDL-first approach, you can follow the [guide](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-sdl-first) to upgrade from `prisma-binding` to an SDL-first setup. - -This guide also explains how to migrate from JavaScript to TypeScript, it therefore basically assumes a **full rewrite** of your existing app. If you want to keep running your application in JavaScript, you can ignore the instructions that relate to the TypeScript setup keep using JavaScript as before. - -The guide assumes that you already went through the [guide for upgrading the Prisma ORM layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql). This means you already: - -- installed the Prisma ORM 2.0 CLI -- created your Prisma ORM 2.0 schema -- introspected your database and resolved potential [schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) -- installed and generated Prisma Client - -The guide further assumes that you have a file setup that looks similar to this: - -``` -. -├── README.md -├── package.json -├── prisma -│ └── schema.prisma -├── prisma1 -│ ├── datamodel.prisma -│ └── prisma.yml -└── src - ├── generated - │ └── prisma.graphql - ├── index.js - └── schema.graphql -``` - -The important parts are: - -- A folder called with `prisma` with your Prisma ORM 2.0 schema -- A folder called `src` with your application code and a schema called `schema.graphql` - -If this is not what your project structure looks like, you'll need to adjust the instructions in the guide to match your own setup. - -## 1. Installing and configuring Nexus - -### 1.1. Install Nexus dependencies - -The first step is to install the Nexus dependency in your project: - -```terminal copy -npm install @nexus/schema -``` - -Next, install the the Prisma ORM plugin for Nexus which will allow you to expose Prisma models in your GraphQL API: - -```terminal copy -npm install nexus-plugin-prisma -``` - -The `nexus-plugin-prisma` dependency bundles all required Prisma ORM dependencies. You should therefore remove the dependencies that you installed when you upgraded the Prisma ORM layer of your app: - -```terminal copy -npm uninstall @prisma/cli @prisma/client -``` - -Note however that you can still invoke the Prisma ORM 2.0 CLI with the familiar command: - -```terminal -npx prisma -``` - -### 1.2. Configure TypeScript - -Since you'll be using TypeScript in this guide, you need to add the required dependencies: - -```terminal copy -npm install typescript ts-node-dev --save-dev -``` - -Create a new file named `tsconfig.json` in the root directory of your project: - -```terminal copy -touch tsconfig.json -``` - -Now add the following contents to the new file: - -```json copy file=tsconfig.json showLineNumbers -{ - "compilerOptions": { - "skipLibCheck": true, - "strict": true, - "rootDir": "src", - "noEmit": true - }, - "include": ["src/**/*"] -} -``` - -### 1.3. Create your basic Nexus setup - -Create the root source file of your API called `index.ts` inside the `src` directory: - -```terminal copy -touch src/index.ts -``` - -Note that for this guide, you'll write the entire application inside of `index.ts`. In practice, you probably want to split your GraphQL types across different files as shown in this [example](https://pris.ly/e/ts/graphql-auth). - -For some basic setup, add this code to `index.ts`: - -```ts file=index.ts showLineNumbers -import { queryType, makeSchema } from '@nexus/schema' -import { nexusSchemaPrisma } from 'nexus-plugin-prisma/schema' -import { GraphQLServer } from 'graphql-yoga' -import { createContext } from './context' - -const Query = queryType({ - definition(t) { - t.string('hello', () => { - return 'Hello Nexus!' - }) - }, -}) - -export const schema = makeSchema({ - types: [Query], - plugins: [nexusSchemaPrisma({ experimentalCRUD: true })], - outputs: { - schema: __dirname + '/../schema.graphql', - typegen: __dirname + '/generated/nexus.ts', - }, - typegenAutoConfig: { - contextType: 'Context.Context', - sources: [ - { - source: '@prisma/client', - alias: 'prisma', - }, - { - source: require.resolve('./context'), - alias: 'Context', - }, - ], - }, -}) - -new GraphQLServer({ schema, context: createContext() }).start(() => - console.log(`Server ready at: http://localhost:4000`) -) -``` - -Note that this setup already contains the configuration of the Prisma ORM plugin for Nexus. This will enable the `t.model` and `t.crud` functionality that you'll get to know later in this guide. - -In the `typegenAutoConfig` setting, you're providing additional types that help your editor to provide your autocompletion as you develop your app. Right now it references a file named `context.ts` that you don't have in your project yet. This file will contain the type of your `context` object that's passed through your GraphQL resolver chain. - -Create the new `context.ts` file inside the `src` directory: - -```terminal copy -touch src/context.ts -``` - -Now add the following code to it: - -```ts -import { PrismaClient } from '@prisma/client' - -const prisma = new PrismaClient() - -export interface Context { - prisma: PrismaClient -} - -export function createContext(): Context { - return { prisma } -} -``` - -Next, adjust the `scripts` section inside your `package.json` to include the following commands: - -```json -{ - "scripts": { - "start": "node dist/server", - "clean": "rm -rf dist", - "build": "npm -s run clean && npm -s run generate && tsc", - "generate": "npm -s run generate:prisma && npm -s run generate:nexus", - "generate:prisma": "prisma generate", - "generate:nexus": "ts-node --transpile-only src/schema", - "dev": "ts-node-dev --no-notify --respawn --transpile-only src" - } -} -``` - -The `dev` script starts a development server that you **always** should have running in the background when developing your app. This is important because of the code generation Nexus performs in the background. - -You can start the development server using the following command: - -```copy -npm run dev -``` - -You should see the following CLI output: - -```terminal -Server ready at: http://localhost:4000 -``` - -Your GraphQL server is now running at [http://localhost:4000](http://localhost:4000). So far it implements a single GraphQL query that you can send as follows: - -```graphql -{ - hello -} -``` - -In the following steps, we'll explain how you can migrate your existing SDL-first GraphQL schema that's implemented with `prisma-binding` to an equivalent setup using Nexus. - -## 2. Create your GraphQL types - -The next step of the upgrade process is to create your _GraphQL types_. In this case, your GraphQL types will mirror the Prisma models (as it likely was the case in your `prisma-binding` setup as well). If a GraphQL type deviates from a Prisma model, you'll be able to easily adjust the exposed GraphQL type accordingly using the Nexus API. - -For the purpose of this guide, you'll keep all the code in a single file. However, you can structure the files to your personal preference and `import` accordingly. - -In Nexus, GraphQL types are defined via the `objectType` function. Import `objectType` and then start with the skeleton for your first GraphQL type. In this case, we're starting by mapping Prisma schema's `User` model to GraphQL: - -```ts copy -import { objectType } from 'nexus' - -const User = objectType({ - name: 'User', - definition(t) { - // the fields of the type will be defined here - }, -}) -``` - -With this code in place, you can start exposing the _fields_ of the `User` model one by one. You can use your editor's autocompletion to save some typing. Inside the body of the `definition` function, type `t.model.` and then hit CTRL+SPACE. This will bring up the autocompletion and suggest all fields that are defined on the `User` model: - -![Exposing Prisma model fields with t.model](./images/expose-prisma-model-fields-with-t-model.png) - -Note that the `model` property on `t` is provided by the `nexus-plugin-prisma`. It leverages the type information from your Prisma schema and lets you expose your Prisma models via GraphQL. - -In that manner, you can start completing your object type definition until you exposed all the fields of the model: - -```ts -const User = objectType({ - name: 'User', - definition(t) { - t.model.id() - t.model.email() - t.model.name() - t.model.jsonData() - t.model.role() - t.model.profile() - t.model.posts() - }, -}) -``` - -At this point, any _relation fields_ might give you TypeScript errors (in this case, that would be `profile` and `posts` which both point to other object types). That's expected, these errors will resolve automatically after you've added the remaining types. - -> **Note**: Be sure to have your Nexus development server that you started with `npm run dev` running all the time. It constantly updates the generated Nexus types that enable the autocompletion in the background as you save a file. - -Note that the `t.model.posts` relation exposes a _list_ of `Post` objects. By default, Nexus exposes only _pagination_ properties for that list – if you want to add _ordering_ and _filtering_ for that relation as well, you'll need to explicitly enable those: - -```ts line-number highlight=10-13;add -const User = objectType({ - name: 'User', - definition(t) { - t.model.id() - t.model.email() - t.model.name() - t.model.jsonData() - t.model.role() - t.model.profile() - //add-start - t.model.posts({ - filtering: true, - ordering: true, - }) - //add-end - }, -}) -``` - -After defining a type using the `objectType` function, you also need to manually add it to your GraphQL schema that you're building with Nexus. You can do it by adding it to the `types` which are provided as an option to the `makeSchema` function: - -```ts line-number -export const schema = makeSchema({ - types: [Query, User], - plugins: [nexusSchemaPrisma()], - outputs: { - schema: __dirname + '/../schema.graphql', - typegen: __dirname + '/generated/nexus.ts', - }, - typegenAutoConfig: { - sources: [ - { - source: '@prisma/client', - alias: 'prisma', - }, - ], - }, -}) -``` - -Once you're done with the first type, you can start defining the remaining ones. - -
- -Expand to view the full version of the sample data model - -To expose all sample Prisma models with Nexus, the following code is needed: - -```ts -const User = objectType({ - name: 'User', - definition(t) { - t.model.id() - t.model.email() - t.model.name() - t.model.jsonData() - t.model.role() - t.model.profile() - t.model.posts({ - filtering: true, - ordering: true, - }) - }, -}) - -const Post = objectType({ - name: 'Post', - definition(t) { - t.model.id() - t.model.createdAt() - t.model.updatedAt() - t.model.title() - t.model.content() - t.model.published() - t.model.author() - t.model.authorId() - t.model.categories({ - filtering: true, - ordering: true, - }) - }, -}) - -const Profile = objectType({ - name: 'Profile', - definition(t) { - t.model.id() - t.model.bio() - t.model.userId() - t.model.user() - }, -}) - -const Category = objectType({ - name: 'Category', - definition(t) { - t.model.id() - t.model.name() - t.model.posts({ - filtering: true, - ordering: true, - }) - }, -}) -``` - -
- -Be sure to include all newly defined types in the `types` option that's provided to `makeSchema`: - -```ts line-number highlight=2;normal -export const schema = makeSchema({ - //highlight-next-line - types: [Query, User, Post, Profile, Category], - plugins: [nexusSchemaPrisma()], - outputs: { - schema: __dirname + '/../schema.graphql', - typegen: __dirname + '/generated/nexus.ts', - }, - typegenAutoConfig: { - sources: [ - { - source: '@prisma/client', - alias: 'prisma', - }, - ], - }, -}) -``` - -You can view the current version of your GraphQL schema in SDL in the generated GraphQL schema file in `./schema.graphql`. - -## 3. Migrate GraphQL operations - -As a next step, you can start migrating all the GraphQL _queries_ and _mutations_ from the "previous" GraphQL API to the new one that's built with Nexus. - -For this guide, the following sample GraphQL schema will be used: - -```graphql -# import Post from './generated/prisma.graphql' -# import User from './generated/prisma.graphql' -# import Category from './generated/prisma.graphql' - -input UserUniqueInput { - id: String - email: String -} - -type Query { - posts(searchString: String): [Post!]! - user(userUniqueInput: UserUniqueInput!): User - users(where: UserWhereInput, orderBy: Enumerable, skip: Int, after: String, before: String, first: Int, last: Int): [User]! -} - -type Mutation { - createUser(data: UserCreateInput!): User! - createDraft(title: String!, content: String, authorId: ID!): Post - updateBio(userUniqueInput: UserUniqueInput!, bio: String!): User - addPostToCategories(postId: String!, categoryIds: [String!]!): Post -} -``` - -### 3.1. Migrate GraphQL queries - -In this section, you'll migrate all GraphQL _queries_ from `prisma-binding` to Nexus. - -#### 3.1.1. Migrate the `users` query (which uses `forwardTo`) - -In our sample API, the `users` query from the sample GraphQL schema is defined and implemented as follows. - -##### SDL schema definition with `prisma-binding` - -```graphql -type Query { - users(where: UserWhereInput, orderBy: Enumerable, skip: Int, after: String, before: String, first: Int, last: Int): [User]! - # ... other queries -} -``` - -##### Resolver implementation with `prisma-binding` - -```js -const resolvers = { - Query: { - users: forwardTo('prisma'), - // ... other resolvers - }, -} -``` - -To mirror the same behaviour with Nexus, you can use the `crud` property on the `t` variable inside the `definition` function. - -Similar to `model`, this property is available because you're using the `nexus-prisma-plugin` which leverages type information from your Prisma models and auto-generates resolvers under the hood. The `crud` property also supports autocompletion, so you can explore all available queries in your editor again: - -![Using t.crud to generate resolvers](./images/use-t-crud-to-generate-resolvers.png) - -##### Forwarding the query with the `nexus-prisma-plugin` - -To add the `users` query to your GraphQL API, add the following lines to the query type definition: - -```ts line-number highlight=3-6;add -const Query = queryType({ - definition(t) { - //add-start - t.crud.users({ - filtering: true, - ordering: true, - }) - //add-end - }, -}) -``` - -If you have the Nexus development server running, you can save the file and your GraphQL API will be updated to expose the new `users` query. You can also observe this by looking at the `Query` type inside the generated `schema.graphql` file: - -```graphql -type Query { - users(after: UserWhereUniqueInput, before: UserWhereUniqueInput, first: Int, last: Int, orderBy: Enumerable, skip: Int, where: UserWhereInput): [User!]! -} -``` - -You can now write your first query against the new API, e.g.: - -```graphql -{ - users { - id - name - profile { - id - bio - } - posts { - id - title - categories { - id - name - } - } - } -} -``` - -If your application exposes all CRUD operations from Prisma ORM using `forwardTo`, you can now continue adding all remaining ones using the same approach via `t.crud`. To learn how "custom" queries can be defined and resolved using Nexus, move on to the next sections. - -#### 3.1.2. Migrate the `posts(searchString: String): [Post!]!` query - -The `posts` query is defined and implemented as follows. - -##### SDL schema definition with `prisma-binding` - -```graphql -type Query { - posts(searchString: String): [Post!]! - # ... other queries -} -``` - -##### Resolver implementation with `prisma-binding` - -```js -const resolvers = { - Query: { - posts: (_, args, context, info) => { - return context.prisma.query.posts( - { - where: { - OR: [ - { title_contains: args.searchString }, - { content_contains: args.searchString }, - ], - }, - }, - info - ) - }, - // ... other resolvers - }, -} -``` - -##### Code-first schema definition with `nexus` - -To get the same behavior with Nexus, you'll need to add a `t.field` definition to the `queryType`: - -```ts line-number highlight=5-9;add -const Query = queryType({ - definition(t) { - // ... previous queries - - //add-start - t.list.field('posts', { - type: 'Post', - nullable: false, - args: { searchString: stringArg() }, - }) - //add-end - }, -}) -``` - -Although this code gives probably gives you a type error in your editor, you can already look at the generated SDL version of your GraphQL schema inside `schema.graphql`. You'll notice that this has added the correct _definition_ to your GraphQL schema already: - -```graphql line-number -type Query { - //highlight-next-line - posts(searchString: String): [Post!]! - users(after: UserWhereUniqueInput, before: UserWhereUniqueInput, first: Int, last: Int, orderBy: Enumerable, skip: Int, where: UserWhereInput): [User!]! -} -``` - -However, the code is missing the actual resolver logic. This is what you're going to add next. - -##### Resolver implementation with `nexus` - -You can add the resolver with Nexus as follows: - -```ts line-number highlight=9-21;add -const Query = queryType({ - definition(t) { - // ... previous queries - - t.list.field('posts', { - type: 'Post', - nullable: false, - args: { searchString: stringArg() }, - //add-start - resolve: (_, args, context) => { - return context.prisma.post.findMany({ - where: { - OR: [ - { - title: { contains: args.searchString }, - }, - { - content: { contains: args.searchString }, - }, - ], - }, - }) - //add-end - }, - }) - }, -}) -``` - -To validate the implementation, you can now e.g. send the following example query to your GraphQL server: - -```graphql -{ - posts { - id - title - author { - id - name - } - } -} -``` - -#### 3.1.2. Migrate the `user(uniqueInput: UserUniqueInput): User` query - -In our sample app, the `user` query is defined and implemented as follows. - -##### SDL schema definition with `prisma-binding` - -```graphql -type Query { - user(userUniqueInput: UserUniqueInput): User - # ... other queries -} - -input UserUniqueInput { - id: String - email: String -} -``` - -Note that this is a bit of a contrived example to demonstrate the usage of `input` types with Nexus. - -##### Resolver implementation with `prisma-binding` - -```js -const resolvers = { - Query: { - user: (_, args, context, info) => { - return context.prisma.query.user( - { - where: args.userUniqueInput, - }, - info - ) - }, - // ... other resolvers - }, -} -``` - -##### Code-first schema definition with `nexus` - -To get the same behavior with Nexus, you'll need to add a `t.field` definition to the `queryType` and define an `inputObjectType` that includes the two `@unique` fields of your `User` model: - -```ts line-number highlight=1,3-9,15-23;add -//add-next-line -import { inputObjectType, arg } from '@nexus/schema' - -//add-start -const UserUniqueInput = inputObjectType({ - name: 'UserUniqueInput', - definition(t) { - t.string('id') - t.string('email') - }, -}) -//add-end - -const Query = queryType({ - definition(t) { - // ... previous queries - - //add-start - t.field('user', { - type: 'User', - args: { - userUniqueInput: arg({ - type: 'UserUniqueInput', - nullable: false, - }), - }, - }) - //add-end - }, -}) -``` - -Since `UserUniqueInput` is a new type in your GraphQL schema, you again need to add it to the `types` option that's passed to `makeSchema`: - -```ts line-number highlight=2;normal -export const schema = makeSchema({ - //highlight-next-line - types: [Query, User, Post, Profile, Category, UserUniqueInput], - plugins: [nexusSchemaPrisma()], - outputs: { - schema: __dirname + '/../schema.graphql', - typegen: __dirname + '/generated/nexus.ts', - }, - typegenAutoConfig: { - sources: [ - { - source: '@prisma/client', - alias: 'prisma', - }, - ], - }, -}) -``` - -If you look at the generated SDL version of your GraphQL schema inside `schema.graphql`, you'll notice that this change already added the correct _definition_ to your GraphQL schema: - -```graphql line-number highlight=3,7-10;normal -type Query { - posts(searchString: String): [Post!] - //highlight-next-line - user(userUniqueInput: UserUniqueInput!): User - users(after: UserWhereUniqueInput, before: UserWhereUniqueInput, first: Int, last: Int, orderBy: Enumerable, skip: Int, where: UserWhereInput): [User!]! -} - -//highlight-start -input UserUniqueInput { - email: String - id: String -} -//highlight-end -``` - -You can even send the respective query via the GraphQL Playground already: - -```graphql -{ - user(userUniqueInput: { email: "alice@prisma.io" }) { - id - name - } -} -``` - -However, because the resolver is not yet implemented you will not get any data back yet. - -##### Code-first resolver implementation with `nexus` - -That's because you're still missing the _resolver_ implementation for that query. You can add the resolver with Nexus as follows: - -```ts line-number highlight=22-29;add -const UserUniqueInput = inputObjectType({ - name: 'UserUniqueInput', - definition(t) { - t.string('id') - t.string('email') - }, -}) - -const Query = queryType({ - definition(t) { - // ... previous queries - - t.field('user', { - type: 'User', - nullable: true, - args: { - userUniqueInput: arg({ - type: 'UserUniqueInput', - nullable: false, - }), - }, - //add-start - resolve: (_, args, context) => { - return context.prisma.user.findUnique({ - where: { - id: args.userUniqueInput?.id, - email: args.userUniqueInput?.email, - }, - }) - }, - //add-end - }) - }, -}) -``` - -If you're re-sending the same query from before, you'll find that it now returns actual data. - -### 3.2. Migrate GraphQL mutations - -In this section, you'll migrate the GraphQL mutations from the sample schema to the Nexus. - -#### 3.2.1. Define the `Mutation` type - -The first step to migrate any mutations is to define the `Mutation` type of your GraphQL API. Once that's done, you can gradually add operations to it. Add the following definition to `index.ts`: - -```ts -import { mutationType } from '@nexus/schema' - -const Mutation = mutationType({ - definition(t) { - // your GraphQL mutations + resolvers will be defined here - }, -}) -``` - -In order to make sure that the new `Mutation` type is picked by up Nexus, you need to add it to the `types` that are provided to `makeSchema`: - -```ts line-number highlight=2;normal -export const schema = makeSchema({ - //highlight-next-line - types: [Query, User, Post, Profile, Category, UserUniqueInput, Mutation], - plugins: [nexusSchemaPrisma()], - outputs: { - schema: __dirname + '/../schema.graphql', - typegen: __dirname + '/generated/nexus.ts', - }, - typegenAutoConfig: { - sources: [ - { - source: '@prisma/client', - alias: 'prisma', - }, - ], - }, -}) -``` - -#### 3.2.2. Migrate the `createUser` mutation (which uses `forwardTo`) - -In the sample app, the `createUser` mutation from the sample GraphQL schema is defined and implemented as follows. - -##### SDL schema definition with `prisma-binding` - -```graphql -type Mutation { - createUser(data: UserCreateInput!): User! - # ... other mutations -} -``` - -##### Resolver implementation with `prisma-binding` - -```js -const resolvers = { - Mutation: { - createUser: forwardTo('prisma'), - // ... other resolvers - }, -} -``` - -Similar to forwarding GraphQL queries, you can use the `crud` property on the `t` variable inside the `definition` function in order to expose full CRUD capabilities for Prisma models. - -Similar to `model`, this property is available because you're using the `nexus-prisma-plugin` which leverages type information from your Prisma models and auto-generates resolvers under the hood. The `crud` property supports autocompletion when defining mutations as well, so you can explore all available operations in your editor again: - -![Generating resolvers with t.crud](./images/regenerate-resolvers-with-t-crud.png) - -##### Forwarding the mutation with the `nexus-prisma-plugin` - -To add the `createUser` mutation to your GraphQL API, add the following lines to the query type definition: - -```ts line-number highlight=3-5;add -const Mutation = mutationType({ - definition(t) { - //add-start - t.crud.createOneUser({ - alias: 'createUser', - }) - //add-end - }, -}) -``` - -Note that the default name for the mutation in your GraphQL schema is `createOneUser` (named after the function which is exposed by `t.crud`). In order to rename it to `createUser`, you need to provide the `alias` property. - -If you have the Nexus development server running, you can save the file and your GraphQL API will be updated to expose the new `createUser` mutation. You can also observe this by looking at the `Mutation` type inside the generated `schema.graphql` file: - -```graphql -type Mutation { - createUser(data: UserCreateInput!): User! -} -``` - -You can now write your first mutation against the new API, e.g.: - -```graphql -mutation { - createUser(data: { name: "Alice", email: "alice@prisma.io" }) { - id - } -} -``` - -If your application exposes all CRUD operations from Prisma Client using `forwardTo`, you can now continue adding all remaining ones using the same approach via `t.crud`. To learn how "custom" mutations can be defined and resolved using Nexus, move on to the next sections. - -#### 3.2.3. Migrate the `createDraft(title: String!, content: String, authorId: String!): Post!` query - -In the sample app, the `createDraft` mutation is defined and implemented as follows. - -##### SDL schema definition with `prisma-binding` - -```graphql -type Mutation { - createDraft(title: String!, content: String, authorId: String!): Post! - # ... other mutations -} -``` - -##### Resolver implementation with `prisma-binding` - -```js -const resolvers = { - Mutation: { - createDraft: (_, args, context, info) => { - return context.prisma.mutation.createPost( - { - data: { - title: args.title, - content: args.content, - author: { - connect: { - id: args.authorId, - }, - }, - }, - }, - info - ) - }, - // ... other resolvers - }, -} -``` - -##### Code-first schema definition with `nexus` - -To get the same behavior with Nexus, you'll need to add a `t.field` definition to the `mutationType`: - -```ts line-number highlight=5-12;add -const Mutation = mutationType({ - definition(t) { - // ... previous mutations - - //add-start - t.field('createDraft', { - type: 'Post', - args: { - title: stringArg({ nullable: false }), - content: stringArg(), - authorId: stringArg({ nullable: false }), - }, - }) - //add-end - }, -}) -``` - -If you look at the generated SDL version of your GraphQL schema inside `schema.graphql`, you'll notice that this has added the correct _definition_ to your GraphQL schema already: - -```graphql line-number highlight=3;normal -type Mutation { - createUser(data: UserCreateInput!): User! - //highlight-next-line - createDraft(title: String!, content: String, authorId: String!): Post! -} -``` - -You can even send the respective mutation via the GraphQL Playground already: - -```graphql -mutation { - createDraft(title: "Hello World", authorId: "__AUTHOR_ID__") { - id - published - author { - id - name - } - } -} -``` - -However, because the resolver is not yet implemented, no new `Post` record will be created and you will not get any data back in the response. - -##### Resolver implementation with `nexus` - -That's because you're still missing the _resolver_ implementation for that mutation. You can add the resolver with Nexus as follows: - -```ts line-number highlight=12-22;add -const Mutation = mutationType({ - definition(t) { - // ... previous mutations - - t.field('createDraft', { - type: 'Post', - args: { - title: stringArg({ nullable: false }), - content: stringArg(), - authorId: stringArg({ nullable: false }), - }, - //add-start - resolve: (_, args, context) => { - return context.prisma.post.create({ - data: { - title: args.title, - content: args.content, - author: { - connect: { id: args.authorId }, - }, - }, - }) - }, - //add-end - }) - }, -}) -``` - -If you're re-sending the same query from before, you'll find that it now create a new `Post` record and return valid data. - -#### 3.2.4. Migrate the `updateBio(bio: String, userUniqueInput: UserUniqueInput!): User` mutation - -In the sample app, the `updateBio` mutation is defined and implemented as follows. - -##### SDL schema definition with `prisma-binding` - -```graphql -type Mutation { - updateBio(bio: String!, userUniqueInput: UserUniqueInput!): User - # ... other mutations -} -``` - -##### Resolver implementation with `prisma-binding` - -```js -const resolvers = { - Mutation: { - updateBio: (_, args, context, info) => { - return context.prisma.mutation.updateUser( - { - data: { - profile: { - update: { bio: args.bio }, - }, - }, - where: { id: args.userId }, - }, - info - ) - }, - // ... other resolvers - }, -} -``` - -##### Code-first schema definition with `nexus` - -To get the same behavior with Nexus, you'll need to add a `t.field` definition to the `mutationType`: - -```ts line-number highlight=5-14;add -const Mutation = mutationType({ - definition(t) { - // ... previous mutations - - //add-start - t.field('updateBio', { - type: 'User', - args: { - userUniqueInput: arg({ - type: 'UserUniqueInput', - nullable: false, - }), - bio: stringArg({ nullable: false }), - }, - }) - //add-end - }, -}) -``` - -If you look at the generated SDL version of your GraphQL schema inside `schema.graphql`, you'll notice that this has added the correct _definition_ to your GraphQL schema already: - -```graphql line-number highlight=4;normal -type Mutation { - createUser(data: UserCreateInput!): User! - createDraft(title: String!, content: String, authorId: String!): Post! - //highlight-next-line - updateBio(bio: String!, userUniqueInput: UserUniqueInput!): User -} -``` - -You can even send the respective mutation via the GraphQL Playground already: - -```graphql -mutation { - updateBio( - userUniqueInput: { email: "alice@prisma.io" } - bio: "I like turtles" - ) { - id - name - profile { - id - bio - } - } -} -``` - -However, because the resolver is not yet implemented, nothing will be updated in the database and you will not get any data back in the response. - -##### Resolver implementation with `nexus` - -That's because you're still missing the _resolver_ implementation for that query. You can add the resolver with Nexus as follows: - -```ts line-number highlight=14-26;add -const Mutation = mutationType({ - definition(t) { - // ... previous mutations - - t.field('updateBio', { - type: 'User', - args: { - userUniqueInput: arg({ - type: 'UserUniqueInput', - nullable: false - }), - bio: stringArg() - }, - //add-start - resolve: (_, args, context) => { - return context.prisma.user.update({ - where: { - id: args.userUniqueInput?.id, - email: args.userUniqueInput?.email - }, - data: { - profile: { - create: { bio: args.bio } - } - } - }) - } - //add-end - } - } -}) -``` - -If you're re-sending the same query from before, you'll find that it now returns actual data instead of `null`. - -#### 3.2.5. Migrate the `addPostToCategories(postId: String!, categoryIds: [String!]!): Post` mutation - -In our sample app, the `addPostToCategories` mutation is defined and implemented as follows. - -##### SDL schema definition with `prisma-binding` - -```graphql -type Mutation { - addPostToCategories(postId: String!, categoryIds: [String!]!): Post - # ... other mutations -} -``` - -##### Resolver implementation with `prisma-binding` - -```js -const resolvers = { - Mutation: { - addPostToCategories: (_, args, context, info) => { - const ids = args.categoryIds.map((id) => ({ id })) - return context.prisma.mutation.updatePost( - { - data: { - categories: { - connect: ids, - }, - }, - where: { - id: args.postId, - }, - }, - info - ) - }, - // ... other resolvers - }, -} -``` - -##### Code-first schema definition with `nexus` - -To get the same behavior with Nexus, you'll need to add a `t.field` definition to the `mutationType`: - -```ts line-number highlight=5-14;add -const Mutation = mutationType({ - definition(t) { - // ... mutations from before - - //add-start - t.field('addPostToCategories', { - type: 'Post', - args: { - postId: stringArg({ nullable: false }), - categoryIds: stringArg({ - list: true, - nullable: false, - }), - }, - }) - //add-end - }, -}) -``` - -If you look at the generated SDL version of your GraphQL schema inside `schema.graphql`, you'll notice that this has added the correct _definition_ to your GraphQL schema already: - -```graphql line-number highlight=5;normal -type Mutation { - createUser(data: UserCreateInput!): User! - createDraft(title: String!, content: String, authorId: String!): Post! - updateBio(bio: String, userUniqueInput: UserUniqueInput!): User - //highlight-next-line - addPostToCategories(postId: String!, categoryIds: [String!]!): Post -} -``` - -You can even send the respective query via the GraphQL Playground already: - -```graphql -mutation { - addPostToCategories( - postId: "__AUTHOR_ID__" - categoryIds: ["__CATEGORY_ID_1__", "__CATEGORY_ID_2__"] - ) { - id - title - categories { - id - name - } - } -} -``` - -However, because the resolver is not yet implemented, nothing will be updated in the database and you will not get any data back in the response. - -##### Resolver implementation with `nexus` - -That's because you're still missing the _resolver_ implementation for that query. You can add the resolver with Nexus as follows: - -```ts line-number highlight=13-23;add -const Mutation = mutationType({ - definition(t) { - // ... mutations from before - t.field('addPostToCategories', { - type: 'Post', - args: { - postId: stringArg({ nullable: false }), - categoryIds: stringArg({ - list: true, - nullable: false, - }), - }, - //add-start - resolve: (_, args, context) => { - const ids = args.categoryIds.map((id) => ({ id })) - return context.prisma.post.update({ - where: { - id: args.postId, - }, - data: { - categories: { connect: ids }, - }, - }) - }, - //add-end - }) - }, -}) -``` - -If you're re-sending the same query from before, you'll find that it now returns actual data instead of `null`. - -## 4. Cleaning up - -Since the entire app has now been upgrade to Prisma ORM 2.0 and Nexus, you can delete all unnecessary files and remove the no longer needed dependencies. - -### 4.1. Clean up npm dependencies - -You can start by removing npm dependencies that were related to the Prisma 1 setup: - -```copy -npm uninstall graphql-cli prisma-binding prisma1 -``` - -### 4.2. Delete unused files - -Next, delete the files of your Prisma 1 setup: - -```copy -rm prisma1/datamodel.prisma prisma1/prisma.yml -``` - -You can also delete any remaining `.js` files, the old `schema.graphql` and `prisma.graphql` files. - -### 4.3. Stop the Prisma ORM server - -Finally, you can stop running your Prisma ORM server. diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/06-upgrading-prisma-binding-to-sdl-first.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/06-upgrading-prisma-binding-to-sdl-first.mdx deleted file mode 100644 index fcca75b411..0000000000 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/06-upgrading-prisma-binding-to-sdl-first.mdx +++ /dev/null @@ -1,1692 +0,0 @@ ---- -title: 'prisma-binding to SDL-first' -metaTitle: 'Upgrading from Prisma 1 with prisma-binding to SDL-first' -metaDescription: 'Learn how to upgrade existing Prisma 1 projects with prisma-binding to Prisma ORM 2 (SDL-first).' ---- - -## Overview - -This upgrade guide describes how to migrate a Node.js project that's based on [Prisma 1](https://github.com/prisma/prisma1) and uses `prisma-binding` to implement a GraphQL server. - -The code will keep the [SDL-first approach](https://www.prisma.io/blog/the-problems-of-schema-first-graphql-development-x1mn4cb0tyl3) for constructing the GraphQL schema. When migrating from `prisma-binding` to Prisma Client, the main difference is that the `info` object can't be used to resolve relations automatically any more, instead you'll need to implement your _type resolvers_ to ensure that relations get resolved properly. - -The guide assumes that you already went through the [guide for upgrading the Prisma ORM layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql). This means you already: - -- installed the Prisma ORM 2 CLI -- created your Prisma ORM 2 schema -- introspected your database and resolved potential schema incompatibilities -- installed and generated Prisma Client - -The guide further assumes that you have a file setup that looks similar to this: - -``` -. -├── README.md -├── package.json -├── prisma -│ └── schema.prisma -├── prisma1 -│ ├── datamodel.prisma -│ └── prisma.yml -└── src - ├── generated - │ └── prisma.graphql - ├── index.js - └── schema.graphql -``` - -The important parts are: - -- A folder called with `prisma` with your Prisma ORM 2 schema -- A folder called `src` with your application code and a schema called `schema.graphql` - -If this is not what your project structure looks like, you'll need to adjust the instructions in the guide to match your own setup. - -## 1. Adjusting your GraphQL schema - -With `prisma-binding`, your approach for defining your GraphQL schema (sometimes called [application schema](https://v1.prisma.io/docs/1.20/data-model-and-migrations/data-model-knul/#a-note-on-the-application-schema)) is based on _importing_ GraphQL types from the generated `prisma.graphql` file (in Prisma 1, this is typically called [Prisma GraphQL schema](https://v1.prisma.io/docs/1.20/data-model-and-migrations/data-model-knul/#the-prisma-graphql-schema)). These types mirror the types from your Prisma 1 datamodel and serve as foundation for your GraphQL API. - -With Prisma ORM 2, there's no `prisma.graphql` file any more that you could import from. Therefore, you have to spell out all the types of your GraphQL schema directly inside your `schema.graphql` file. - -The easiest way to do so is by downloading the full GraphQL schema from the GraphQL Playground. To do so, open the **SCHEMA** tab and click the **DOWNLOAD** button in the top-right corner, then select **SDL**: - -![Downloading the GraphQL schema with GraphQL Playground](./images/download-graphql-schema.png) - -Alternatively, you can use the `get-schema` command of the [GraphQL CLI](https://github.com/Urigo/graphql-cli) to download your full schema: - -``` -npx graphql get-schema --endpoint __GRAPHQL_YOGA_ENDPOINT__ --output schema.graphql --no-all -``` - -> **Note**: With the above command, you need to replace the `__GRAPHQL_YOGA_ENDPOINT__` placeholder with the actual endpoint of your GraphQL Yoga server. - -Once you obtained the `schema.graphql` file, replace your current version in `src/schema.graphql` with the new contents. Note that the two schemas are 100% equivalent, except that the new one doesn't use [`graphql-import`](https://github.com/ardatan/graphql-import) for importing types from a different file. Instead, it spells out all types in a single file. - -Here's a comparison of these two versions of the sample GraphQL schema that we'll migrate in this guide (you can use the tabs to switch between the two versions): - - - - -```graphql -# import Post from './generated/prisma.graphql' -# import User from './generated/prisma.graphql' -# import Category from './generated/prisma.graphql' - -type Query { - posts(searchString: String): [Post!]! - user(userUniqueInput: UserUniqueInput!): User - users(where: UserWhereInput, orderBy: Enumerable, skip: Int, after: String, before: String, first: Int, last: Int): [User]! - allCategories: [Category!]! -} - -input UserUniqueInput { - id: String - email: String -} - -type Mutation { - createDraft(authorId: ID!, title: String!, content: String!): Post - publish(id: ID!): Post - deletePost(id: ID!): Post - signup(name: String!, email: String!): User! - updateBio(userId: String!, bio: String!): User - addPostToCategories(postId: String!, categoryIds: [String!]!): Post -} -``` - - - - -```graphql -type Query { - posts(searchString: String): [Post!]! - user(id: ID!): User - users(where: UserWhereInput, orderBy: Enumerable, skip: Int, after: String, before: String, first: Int, last: Int): [User]! - allCategories: [Category!]! -} - -type Category implements Node { - id: ID! - name: String! - posts(where: PostWhereInput, orderBy: Enumerable, skip: Int, after: String, before: String, first: Int, last: Int): [Post!] -} - -input CategoryCreateManyWithoutPostsInput { - create: [CategoryCreateWithoutPostsInput!] - connect: [CategoryWhereUniqueInput!] -} - -input CategoryCreateWithoutPostsInput { - id: ID - name: String! -} - -enum CategoryOrderByInput { - id_ASC - id_DESC - name_ASC - name_DESC -} - -input CategoryWhereInput { - """Logical AND on all given filters.""" - AND: [CategoryWhereInput!] - - """Logical OR on all given filters.""" - OR: [CategoryWhereInput!] - - """Logical NOT on all given filters combined by AND.""" - NOT: [CategoryWhereInput!] - id: ID - - """All values that are not equal to given value.""" - id_not: ID - - """All values that are contained in given list.""" - id_in: [ID!] - - """All values that are not contained in given list.""" - id_not_in: [ID!] - - """All values less than the given value.""" - id_lt: ID - - """All values less than or equal the given value.""" - id_lte: ID - - """All values greater than the given value.""" - id_gt: ID - - """All values greater than or equal the given value.""" - id_gte: ID - - """All values containing the given string.""" - id_contains: ID - - """All values not containing the given string.""" - id_not_contains: ID - - """All values starting with the given string.""" - id_starts_with: ID - - """All values not starting with the given string.""" - id_not_starts_with: ID - - """All values ending with the given string.""" - id_ends_with: ID - - """All values not ending with the given string.""" - id_not_ends_with: ID - name: String - - """All values that are not equal to given value.""" - name_not: String - - """All values that are contained in given list.""" - name_in: [String!] - - """All values that are not contained in given list.""" - name_not_in: [String!] - - """All values less than the given value.""" - name_lt: String - - """All values less than or equal the given value.""" - name_lte: String - - """All values greater than the given value.""" - name_gt: String - - """All values greater than or equal the given value.""" - name_gte: String - - """All values containing the given string.""" - name_contains: String - - """All values not containing the given string.""" - name_not_contains: String - - """All values starting with the given string.""" - name_starts_with: String - - """All values not starting with the given string.""" - name_not_starts_with: String - - """All values ending with the given string.""" - name_ends_with: String - - """All values not ending with the given string.""" - name_not_ends_with: String - posts_every: PostWhereInput - posts_some: PostWhereInput - posts_none: PostWhereInput -} - -input CategoryWhereUniqueInput { - id: ID -} - -scalar DateTime - -"""Raw JSON value""" -scalar Json - -"""An object with an ID""" -interface Node { - """The id of the object.""" - id: ID! -} - -type Post implements Node { - id: ID! - createdAt: DateTime! - updatedAt: DateTime! - title: String! - content: String - published: Boolean! - author: User - categories(where: CategoryWhereInput, orderBy: Enumerable, skip: Int, after: String, before: String, first: Int, last: Int): [Category!] -} - -input PostCreateManyWithoutAuthorInput { - create: [PostCreateWithoutAuthorInput!] - connect: [PostWhereUniqueInput!] -} - -input PostCreateWithoutAuthorInput { - id: ID - title: String! - content: String - published: Boolean - categories: CategoryCreateManyWithoutPostsInput -} - -enum PostOrderByInput { - id_ASC - id_DESC - createdAt_ASC - createdAt_DESC - updatedAt_ASC - updatedAt_DESC - title_ASC - title_DESC - content_ASC - content_DESC - published_ASC - published_DESC -} - -input PostWhereInput { - """Logical AND on all given filters.""" - AND: [PostWhereInput!] - - """Logical OR on all given filters.""" - OR: [PostWhereInput!] - - """Logical NOT on all given filters combined by AND.""" - NOT: [PostWhereInput!] - id: ID - - """All values that are not equal to given value.""" - id_not: ID - - """All values that are contained in given list.""" - id_in: [ID!] - - """All values that are not contained in given list.""" - id_not_in: [ID!] - - """All values less than the given value.""" - id_lt: ID - - """All values less than or equal the given value.""" - id_lte: ID - - """All values greater than the given value.""" - id_gt: ID - - """All values greater than or equal the given value.""" - id_gte: ID - - """All values containing the given string.""" - id_contains: ID - - """All values not containing the given string.""" - id_not_contains: ID - - """All values starting with the given string.""" - id_starts_with: ID - - """All values not starting with the given string.""" - id_not_starts_with: ID - - """All values ending with the given string.""" - id_ends_with: ID - - """All values not ending with the given string.""" - id_not_ends_with: ID - createdAt: DateTime - - """All values that are not equal to given value.""" - createdAt_not: DateTime - - """All values that are contained in given list.""" - createdAt_in: [DateTime!] - - """All values that are not contained in given list.""" - createdAt_not_in: [DateTime!] - - """All values less than the given value.""" - createdAt_lt: DateTime - - """All values less than or equal the given value.""" - createdAt_lte: DateTime - - """All values greater than the given value.""" - createdAt_gt: DateTime - - """All values greater than or equal the given value.""" - createdAt_gte: DateTime - updatedAt: DateTime - - """All values that are not equal to given value.""" - updatedAt_not: DateTime - - """All values that are contained in given list.""" - updatedAt_in: [DateTime!] - - """All values that are not contained in given list.""" - updatedAt_not_in: [DateTime!] - - """All values less than the given value.""" - updatedAt_lt: DateTime - - """All values less than or equal the given value.""" - updatedAt_lte: DateTime - - """All values greater than the given value.""" - updatedAt_gt: DateTime - - """All values greater than or equal the given value.""" - updatedAt_gte: DateTime - title: String - - """All values that are not equal to given value.""" - title_not: String - - """All values that are contained in given list.""" - title_in: [String!] - - """All values that are not contained in given list.""" - title_not_in: [String!] - - """All values less than the given value.""" - title_lt: String - - """All values less than or equal the given value.""" - title_lte: String - - """All values greater than the given value.""" - title_gt: String - - """All values greater than or equal the given value.""" - title_gte: String - - """All values containing the given string.""" - title_contains: String - - """All values not containing the given string.""" - title_not_contains: String - - """All values starting with the given string.""" - title_starts_with: String - - """All values not starting with the given string.""" - title_not_starts_with: String - - """All values ending with the given string.""" - title_ends_with: String - - """All values not ending with the given string.""" - title_not_ends_with: String - content: String - - """All values that are not equal to given value.""" - content_not: String - - """All values that are contained in given list.""" - content_in: [String!] - - """All values that are not contained in given list.""" - content_not_in: [String!] - - """All values less than the given value.""" - content_lt: String - - """All values less than or equal the given value.""" - content_lte: String - - """All values greater than the given value.""" - content_gt: String - - """All values greater than or equal the given value.""" - content_gte: String - - """All values containing the given string.""" - content_contains: String - - """All values not containing the given string.""" - content_not_contains: String - - """All values starting with the given string.""" - content_starts_with: String - - """All values not starting with the given string.""" - content_not_starts_with: String - - """All values ending with the given string.""" - content_ends_with: String - - """All values not ending with the given string.""" - content_not_ends_with: String - published: Boolean - - """All values that are not equal to given value.""" - published_not: Boolean - author: UserWhereInput - categories_every: CategoryWhereInput - categories_some: CategoryWhereInput - categories_none: CategoryWhereInput -} - -input PostWhereUniqueInput { - id: ID -} - -type Profile implements Node { - id: ID! - bio: String - user: User! -} - -input ProfileCreateOneWithoutUserInput { - create: ProfileCreateWithoutUserInput - connect: ProfileWhereUniqueInput -} - -input ProfileCreateWithoutUserInput { - id: ID - bio: String -} - -input ProfileWhereInput { - """Logical AND on all given filters.""" - AND: [ProfileWhereInput!] - - """Logical OR on all given filters.""" - OR: [ProfileWhereInput!] - - """Logical NOT on all given filters combined by AND.""" - NOT: [ProfileWhereInput!] - id: ID - - """All values that are not equal to given value.""" - id_not: ID - - """All values that are contained in given list.""" - id_in: [ID!] - - """All values that are not contained in given list.""" - id_not_in: [ID!] - - """All values less than the given value.""" - id_lt: ID - - """All values less than or equal the given value.""" - id_lte: ID - - """All values greater than the given value.""" - id_gt: ID - - """All values greater than or equal the given value.""" - id_gte: ID - - """All values containing the given string.""" - id_contains: ID - - """All values not containing the given string.""" - id_not_contains: ID - - """All values starting with the given string.""" - id_starts_with: ID - - """All values not starting with the given string.""" - id_not_starts_with: ID - - """All values ending with the given string.""" - id_ends_with: ID - - """All values not ending with the given string.""" - id_not_ends_with: ID - bio: String - - """All values that are not equal to given value.""" - bio_not: String - - """All values that are contained in given list.""" - bio_in: [String!] - - """All values that are not contained in given list.""" - bio_not_in: [String!] - - """All values less than the given value.""" - bio_lt: String - - """All values less than or equal the given value.""" - bio_lte: String - - """All values greater than the given value.""" - bio_gt: String - - """All values greater than or equal the given value.""" - bio_gte: String - - """All values containing the given string.""" - bio_contains: String - - """All values not containing the given string.""" - bio_not_contains: String - - """All values starting with the given string.""" - bio_starts_with: String - - """All values not starting with the given string.""" - bio_not_starts_with: String - - """All values ending with the given string.""" - bio_ends_with: String - - """All values not ending with the given string.""" - bio_not_ends_with: String - user: UserWhereInput -} - -input ProfileWhereUniqueInput { - id: ID -} - -enum Role { - ADMIN - CUSTOMER -} - -type User implements Node { - id: ID! - email: String - name: String! - posts(where: PostWhereInput, orderBy: Enumerable, skip: Int, after: String, before: String, first: Int, last: Int): [Post!] - role: Role! - profile: Profile - jsonData: Json -} - -input UserCreateInput { - id: ID - email: String - name: String! - role: Role - jsonData: Json - posts: PostCreateManyWithoutAuthorInput - profile: ProfileCreateOneWithoutUserInput -} - -enum UserOrderByInput { - id_ASC - id_DESC - email_ASC - email_DESC - name_ASC - name_DESC - role_ASC - role_DESC - jsonData_ASC - jsonData_DESC -} - -input UserWhereInput { - """Logical AND on all given filters.""" - AND: [UserWhereInput!] - - """Logical OR on all given filters.""" - OR: [UserWhereInput!] - - """Logical NOT on all given filters combined by AND.""" - NOT: [UserWhereInput!] - id: ID - - """All values that are not equal to given value.""" - id_not: ID - - """All values that are contained in given list.""" - id_in: [ID!] - - """All values that are not contained in given list.""" - id_not_in: [ID!] - - """All values less than the given value.""" - id_lt: ID - - """All values less than or equal the given value.""" - id_lte: ID - - """All values greater than the given value.""" - id_gt: ID - - """All values greater than or equal the given value.""" - id_gte: ID - - """All values containing the given string.""" - id_contains: ID - - """All values not containing the given string.""" - id_not_contains: ID - - """All values starting with the given string.""" - id_starts_with: ID - - """All values not starting with the given string.""" - id_not_starts_with: ID - - """All values ending with the given string.""" - id_ends_with: ID - - """All values not ending with the given string.""" - id_not_ends_with: ID - email: String - - """All values that are not equal to given value.""" - email_not: String - - """All values that are contained in given list.""" - email_in: [String!] - - """All values that are not contained in given list.""" - email_not_in: [String!] - - """All values less than the given value.""" - email_lt: String - - """All values less than or equal the given value.""" - email_lte: String - - """All values greater than the given value.""" - email_gt: String - - """All values greater than or equal the given value.""" - email_gte: String - - """All values containing the given string.""" - email_contains: String - - """All values not containing the given string.""" - email_not_contains: String - - """All values starting with the given string.""" - email_starts_with: String - - """All values not starting with the given string.""" - email_not_starts_with: String - - """All values ending with the given string.""" - email_ends_with: String - - """All values not ending with the given string.""" - email_not_ends_with: String - name: String - - """All values that are not equal to given value.""" - name_not: String - - """All values that are contained in given list.""" - name_in: [String!] - - """All values that are not contained in given list.""" - name_not_in: [String!] - - """All values less than the given value.""" - name_lt: String - - """All values less than or equal the given value.""" - name_lte: String - - """All values greater than the given value.""" - name_gt: String - - """All values greater than or equal the given value.""" - name_gte: String - - """All values containing the given string.""" - name_contains: String - - """All values not containing the given string.""" - name_not_contains: String - - """All values starting with the given string.""" - name_starts_with: String - - """All values not starting with the given string.""" - name_not_starts_with: String - - """All values ending with the given string.""" - name_ends_with: String - - """All values not ending with the given string.""" - name_not_ends_with: String - role: Role - - """All values that are not equal to given value.""" - role_not: Role - - """All values that are contained in given list.""" - role_in: [Role!] - - """All values that are not contained in given list.""" - role_not_in: [Role!] - posts_every: PostWhereInput - posts_some: PostWhereInput - posts_none: PostWhereInput - profile: ProfileWhereInput -} -``` - - - - -You'll notice that the new version of your GraphQL schema not only defines the _models_ that were imported directly, but also additional types (e.g. `input` types) that were not present in the schema before. - -## 2. Set up your `PrismaClient` instance - -`PrismaClient` is your new interface to the database in Prisma ORM 2. It lets you invoke various methods which build SQL queries and send them to the database, returning the results as plain JavaScript objects. - -The `PrismaClient` query API is inspired by the initial `prisma-binding` API, so a lot of the queries you send with Prisma Client will feel familiar. - -Similar to the `prisma-binding` instance from Prisma 1, you also want to attach your `PrismaClient` from Prisma ORM 2 to GraphQL's `context` so that in can be accessed inside your resolvers: - -```js line-number highlight=10-13;delete|14;add -const { PrismaClient } = require('@prisma/client') - -// ... - -const server = new GraphQLServer({ - typeDefs: 'src/schema.graphql', - resolvers, - context: (req) => ({ - ...req, - //delete-start - prisma: new Prisma({ - typeDefs: 'src/generated/prisma.graphql', - endpoint: 'http://localhost:4466', - }), - //delete-end - //add-next-line - prisma: new PrismaClient(), - }), -}) -``` - -In the code block above, the _red_ lines are the lines to be removed from your current setup, the _green_ lines are the ones that you should add. Of course, it's possible that your previous setup differed from this one (e.g. it's unlikely that your Prisma ORM `endpoint` was `http://localhost:4466` if you're running your API in production), this is just a sample to indicate what it _could_ look like. - -When you're now accessing `context.prisma` inside of a resolver, you now have access to Prisma Client queries. - -## 2. Write your GraphQL type resolvers - -`prisma-binding` was able to _magically_ resolve relations in your GraphQL schema. When not using `prisma-binding` though, you need to explicitly resolve your relations using so-called _type resolvers_. - -> **Note** You can learn more about the concept of type resolvers and why they're necessary in this article: [GraphQL Server Basics: GraphQL Schemas, TypeDefs & Resolvers Explained](https://www.prisma.io/blog/graphql-server-basics-the-schema-ac5e2950214e) - -### 2.1. Implementing the type resolver for the `User` type - -The `User` type in our sample GraphQL schema is defined as follows: - -```graphql -type User implements Node { - id: ID! - email: String - name: String! - posts( - where: PostWhereInput - orderBy: Enumerable - skip: Int - after: String - before: String - first: Int - last: Int - ): [Post!] - role: Role! - profile: Profile - jsonData: Json -} -``` - -This type has two relations: - -- The `posts` field denotes a 1-n relation to `Post` -- The `profile` field denotes a 1-1 relation to `Profile` - -Since you're not using `prisma-binding` any more, you now need to resolve these relations "manually" in type resolvers. - -You can do so by adding a `User` field to your _resolver map_ and implement the resolvers for the `posts` and `profile` relations as follows: - -```js line-number highlight=8-23;add -const resolvers = { - Query: { - // ... your query resolvers - }, - Mutation: { - // ... your mutation resolvers - }, - //add-start - User: { - posts: (parent, args, context) => { - return context.prisma.user - .findUnique({ - where: { id: parent.id }, - }) - .posts() - }, - profile: (parent, args, context) => { - return context.prisma.user - .findUnique({ - where: { id: parent.id }, - }) - .profile() - }, - }, - //add-end -} -``` - -Inside of these resolvers, you're using your new `PrismaClient` to perform a query against the database. Inside the `posts` resolver, the database query loads all `Post` records from the specified `author` (whose `id` is carried in the `parent` object). Inside the `profile` resolver, the database query loads the `Profile` record from the specified `user` (whose `id` is carried in the `parent` object). - -Thanks to these extra resolvers, you'll now be able to nest relations in your GraphQL queries/mutations whenever you're requesting information about the `User` type in a query, e.g.: - -```graphql -{ - users { - id - name - posts { - # fetching this relation is enabled by the new type resolver - id - title - } - profile { - # fetching this relation is enabled by the new type resolver - id - bio - } - } -} -``` - -### 2.2. Implementing the type resolver for the `Post` type - -The `Post` type in our sample GraphQL schema is defined as follows: - -```graphql -type Post implements Node { - id: ID! - createdAt: DateTime! - updatedAt: DateTime! - title: String! - content: String - published: Boolean! - author: User - categories( - where: CategoryWhereInput - orderBy: Enumerable - skip: Int - after: String - before: String - first: Int - last: Int - ): [Category!] -} -``` - -This type has two relations: - -- The `author` field denotes a 1-n relation to `User` -- The `categories` field denotes a m-n relation to `Category` - -Since you're not using `prisma-binding` any more, you now need to resolve these relations "manually" in type resolvers. - -You can do so by adding a `Post` field to your _resolver map_ and implement the resolvers for the `author` and `categories` relations as follows: - -```js line-number highlight=11-26;add -const resolvers = { - Query: { - // ... your query resolvers - }, - Mutation: { - // ... your mutation resolvers - }, - User: { - // ... your type resolvers for `User` from before - }, - //add-start - Post: { - author: (parent, args, context) => { - return context.prisma.post - .findUnique({ - where: { id: parent.id }, - }) - .author() - }, - categories: (parent, args, context) => { - return context.prisma.post - .findUnique({ - where: { id: parent.id }, - }) - .categories() - }, - }, - //add-end -} -``` - -Inside of these resolvers, you're using your new `PrismaClient` to perform a query against the database. Inside the `author` resolver, the database query loads the `User` record that represents the `author` of the `Post`. Inside the `categories` resolver, the database query loads all `Category` records from the specified `post` (whose `id` is carried in the `parent` object). - -Thanks to these extra resolvers, you'll now be able to nest relations in your GraphQL queries/mutations whenever you're requesting information about the `User` type in a query, e.g.: - -```graphql -{ - posts { - id - title - author { - # fetching this relation is enabled by the new type resolver - id - name - } - categories { - # fetching this relation is enabled by the new type resolver - id - name - } - } -} -``` - -### 2.3. Implementing the type resolver for the `Profile` type - -The `Profile` type in our sample GraphQL schema is defined as follows: - -```graphql -type Profile implements Node { - id: ID! - bio: String - user: User! -} -``` - -This type has one relation: The `user` field denotes a 1-n relation to `User`. - -Since you're not using `prisma-binding` any more, you now need to resolve this relation "manually" in type resolvers. - -You can do so by adding a `Profile` field to your _resolver map_ and implement the resolvers for the `owner` relation as follows: - -```js line-number highlight=14-22;add -const resolvers = { - Query: { - // ... your query resolvers - }, - Mutation: { - // ... your mutation resolvers - }, - User: { - // ... your type resolvers for `User` from before - }, - Post: { - // ... your type resolvers for `Post` from before - }, - //add-start - Profile: { - user: (parent, args, context) => { - return context.prisma.profile - .findUnique({ - where: { id: parent.id }, - }) - .owner() - }, - }, - //add-end -} -``` - -Inside of this resolver, you're using your new `PrismaClient` to perform a query against the database. Inside the `user` resolver, the database query loads the `User` records from the specified `profile` (whose `id` is carried in the `parent` object). - -Thanks to this extra resolver, you'll now be able to nest relations in your GraphQL queries/mutations whenever you're requesting information about the `Profile` type in a query. - -### 2.4. Implementing the type resolver for the `Category` type - -The `Category` type in our sample GraphQL schema is defined as follows: - -```graphql -type Category implements Node { - id: ID! - name: String! - posts( - where: PostWhereInput - orderBy: Enumerable - skip: Int - after: String - before: String - first: Int - last: Int - ): [Post!] -} -``` - -This type has one relation: The `posts` field denotes a m-n relation to `Post`. - -Since you're not using `prisma-binding` any more, you now need to resolve this relation "manually" in type resolvers. - -You can do so by adding a `Category` field to your _resolver map_ and implement the resolvers for the `posts` and `profile` relations as follows: - -```js line-number highlight=17-25;add -const resolvers = { - Query: { - // ... your query resolvers - }, - Mutation: { - // ... your mutation resolvers - }, - User: { - // ... your type resolvers for `User` from before - }, - Post: { - // ... your type resolvers for `Post` from before - }, - Profile: { - // ... your type resolvers for `User` from before - }, - //add-start - Category: { - posts: (parent, args, context) => { - return context.prisma - .findUnique({ - where: { id: parent.id }, - }) - .posts() - }, - }, - //add-end -} -``` - -Inside of this resolver, you're using your new `PrismaClient` to perform a query against the database. Inside the `posts` resolver, the database query loads all `Post` records from the specified `categories` (whose `id` is carried in the `parent` object). - -Thanks to this extra resolver, you'll now be able to nest relations in your GraphQL queries/mutations whenever you're requesting information about a `Category` type in a query. - -With all your type resolvers in place, you can start migrating the actual GraphQL API operations. - -## 3. Migrate GraphQL operations - -### 3.1. Migrate GraphQL queries - -In this section, you'll migrate all GraphQL _queries_ from `prisma-binding` to Prisma Client. - -#### 3.1.1. Migrate the `users` query (which uses `forwardTo`) - -In our sample API, the `users` query from the sample GraphQL schema is defined and implemented as follows. - -##### SDL schema definition with `prisma-binding` - -```graphql -type Query { - users(where: UserWhereInput, orderBy: Enumerable, skip: Int, after: String, before: String, first: Int, last: Int): [User]! - # ... other queries -} -``` - -##### Resolver implementation with `prisma-binding` - -```js -const resolvers = { - Query: { - users: forwardTo('prisma'), - // ... other resolvers - }, -} -``` - -##### Implementing the `users` resolver with Prisma Client - -To re-implement queries that were previously using `forwardTo`, the idea is to pass the incoming filtering, ordering and pagination arguments to `PrismaClient`: - -```js -const resolvers = { - Query: { - users: (_, args, context, info) => { - // this doesn't work yet - const { where, orderBy, skip, first, last, after, before } = args - return context.prisma.user.findMany({ - where, - orderBy, - skip, - first, - last, - after, - before, - }) - }, - // ... other resolvers - }, -} -``` - -Note that this approach does **not** work yet because the _structures_ of the incoming arguments is different from the ones expected by `PrismaClient`. To ensure the structures are compatible, you can use the `@prisma/binding-argument-transform` npm package which ensures compatibility: - -```copy -npm install @prisma/binding-argument-transform -``` - -You can now use this package as follows: - -```js -const { - makeOrderByPrisma2Compatible, - makeWherePrisma2Compatible, -} = require('@prisma/binding-argument-transform') - -const resolvers = { - Query: { - users: (_, args, context, info) => { - // this still doesn't entirely work - const { where, orderBy, skip, first, last, after, before } = args - const prisma2Where = makeWherePrisma2Compatible(where) - const prisma2OrderBy = makeOrderByPrisma2Compatible(orderBy) - return context.prisma.user.findMany({ - where: prisma2Where, - orderBy: prisma2OrderBy, - skip, - first, - last, - after, - before, - }) - }, - // ... other resolvers - }, -} -``` - -The last remaining issue with this are the pagination arguments. Prisma ORM 2 introduces a [new pagination API](https://github.com/prisma/prisma/releases/tag/2.0.0-beta.7): - -- The `first`, `last`, `before` and `after` arguments are removed -- The new `cursor` argument replaces `before` and `after` -- The new `take` argument replaces `first` and `last` - -Here is how you can adjust the call to make it compliant with the new Prisma Client pagination API: - -```js -const { - makeOrderByPrisma2Compatible, - makeWherePrisma2Compatible, -} = require('@prisma/binding-argument-transform') - -const resolvers = { - Query: { - users: (_, args, context) => { - const { where, orderBy, skip, first, last, after, before } = args - const prisma2Where = makeWherePrisma2Compatible(where) - const prisma2OrderBy = makeOrderByPrisma2Compatible(orderBy) - const skipValue = skip || 0 - const prisma2Skip = Boolean(before) ? skipValue + 1 : skipValue - const prisma2Take = Boolean(last) ? -last : first - const prisma2Before = { id: before } - const prisma2After = { id: after } - const prisma2Cursor = - !Boolean(before) && !Boolean(after) - ? undefined - : Boolean(before) - ? prisma2Before - : prisma2After - return context.prisma.user.findMany({ - where: prisma2Where, - orderBy: prisma2OrderBy, - skip: prisma2Skip, - cursor: prisma2Cursor, - take: prisma2Take, - }) - }, - // ... other resolvers - }, -} -``` - -The calculations are needed to ensure the incoming pagination arguments map properly to the ones from the Prisma Client API. - -#### 3.1.2. Migrate the `posts(searchString: String): [Post!]!` query - -The `posts` query is defined and implemented as follows. - -##### SDL schema definition with `prisma-binding` - -```graphql -type Query { - posts(searchString: String): [Post!]! - # ... other queries -} -``` - -##### Resolver implementation with `prisma-binding` - -```js -const resolvers = { - Query: { - posts: (_, args, context, info) => { - return context.prisma.query.posts( - { - where: { - OR: [ - { title_contains: args.searchString }, - { content_contains: args.searchString }, - ], - }, - }, - info - ) - }, - // ... other resolvers - }, -} -``` - -##### Implementing the `posts` resolver with Prisma Client - -To get the same behavior with the new Prisma Client, you'll need to adjust your resolver implementation: - -```js line-number highlight=3-11;normal -const resolvers = { - Query: { - //highlight-start - posts: (_, args, context) => { - return context.prisma.post.findMany({ - where: { - OR: [ - { title: { contains: args.searchString } }, - { content: { contains: args.searchString } }, - ], - }, - }) - //highlight-end - }, - // ... other resolvers - }, -} -``` - -You can now send the respective query in the GraphQL Playground: - -```graphql -{ - posts { - id - title - author { - id - name - } - } -} -``` - -#### 3.1.3. Migrate the `user(uniqueInput: UserUniqueInput): User` query - -In our sample app, the `user` query is defined and implemented as follows. - -##### SDL schema definition with `prisma-binding` - -```graphql -type Query { - user(userUniqueInput: UserUniqueInput): User - # ... other queries -} - -input UserUniqueInput { - id: String - email: String -} -``` - -##### Resolver implementation with `prisma-binding` - -```js -const resolvers = { - Query: { - user: (_, args, context, info) => { - return context.prisma.query.user( - { - where: args.userUniqueInput, - }, - info - ) - }, - // ... other resolvers - }, -} -``` - -##### Implementing the `user` resolver with Prisma Client - -To get the same behavior with the new Prisma Client, you'll need to adjust your resolver implementation: - -```js line-number highlight=3-7;normal -const resolvers = { - Query: { - //highlight-start - user: (_, args, context) => { - return context.prisma.user.findUnique({ - where: args.userUniqueInput, - }) - }, - //highlight-end - // ... other resolvers - }, -} -``` - -You can now send the respective query via the GraphQL Playground: - -```graphql -{ - user(userUniqueInput: { email: "alice@prisma.io" }) { - id - name - } -} -``` - -### 3.1. Migrate GraphQL mutations - -In this section, you'll migrate the GraphQL mutations from the sample schema. - -#### 3.1.2. Migrate the `createUser` mutation (which uses `forwardTo`) - -In the sample app, the `createUser` mutation from the sample GraphQL schema is defined and implemented as follows. - -##### SDL schema definition with `prisma-binding` - -```graphql -type Mutation { - createUser(data: UserCreateInput!): User! - # ... other mutations -} -``` - -##### Resolver implementation with `prisma-binding` - -```js -const resolvers = { - Mutation: { - createUser: forwardTo('prisma'), - // ... other resolvers - }, -} -``` - -##### Implementing the `createUser` resolver with Prisma Client - -To get the same behavior with the new Prisma Client, you'll need to adjust your resolver implementation: - -```js line-number highlight=3-7;normal -const resolvers = { - Mutation: { - //highlight-start - createUser: (_, args, context, info) => { - return context.prisma.user.create({ - data: args.data, - }) - }, - //highlight-end - // ... other resolvers - }, -} -``` - -You can now write your first mutation against the new API, e.g.: - -```graphql -mutation { - createUser(data: { name: "Alice", email: "alice@prisma.io" }) { - id - } -} -``` - -#### 3.1.3. Migrate the `createDraft(title: String!, content: String, authorId: String!): Post!` query - -In the sample app, the `createDraft` mutation is defined and implemented as follows. - -##### SDL schema definition with `prisma-binding` - -```graphql -type Mutation { - createDraft(title: String!, content: String, authorId: String!): Post! - # ... other mutations -} -``` - -##### Resolver implementation with `prisma-binding` - -```js -const resolvers = { - Mutation: { - createDraft: (_, args, context, info) => { - return context.prisma.mutation.createPost( - { - data: { - title: args.title, - content: args.content, - author: { - connect: { - id: args.authorId, - }, - }, - }, - }, - info - ) - }, - // ... other resolvers - }, -} -``` - -##### Implementing the `createDraft` resolver with Prisma Client - -To get the same behavior with the new Prisma Client, you'll need to adjust your resolver implementation: - -```js line-number highlight=3-15;normal -const resolvers = { - Mutation: { - //highlight-start - createDraft: (_, args, context, info) => { - return context.prisma.post.create({ - data: { - title: args.title, - content: args.content, - author: { - connect: { - id: args.authorId, - }, - }, - }, - }) - }, - //highlight-end - // ... other resolvers - }, -} -``` - -You can now send the respective mutation via the GraphQL Playground: - -```graphql -mutation { - createDraft(title: "Hello World", authorId: "__AUTHOR_ID__") { - id - published - author { - id - name - } - } -} -``` - -#### 3.1.4. Migrate the `updateBio(bio: String, userUniqueInput: UserUniqueInput!): User` mutation - -In the sample app, the `updateBio` mutation is defined and implemented as follows. - -##### SDL schema definition with `prisma-binding` - -```graphql -type Mutation { - updateBio(bio: String!, userUniqueInput: UserUniqueInput!): User - # ... other mutations -} -``` - -##### Resolver implementation with `prisma-binding` - -```js -const resolvers = { - Mutation: { - updateBio: (_, args, context, info) => { - return context.prisma.mutation.updateUser( - { - data: { - profile: { - update: { bio: args.bio }, - }, - }, - where: { id: args.userId }, - }, - info - ) - }, - // ... other resolvers - }, -} -``` - -##### Implementing the `updateBio` resolver with Prisma Client - -To get the same behavior with Prisma Client, you'll need to adjust your resolver implementation: - -```js line-number highlight=3-12;normal -const resolvers = { - Mutation: { - //highlight-start - updateBio: (_, args, context, info) => { - return context.prisma.user.update({ - data: { - profile: { - update: { bio: args.bio }, - }, - }, - where: args.userUniqueInput, - }) - }, - //highlight-end - // ... other resolvers - }, -} -``` - -You can now send the respective mutation via the GraphQL Playground : - -```graphql -mutation { - updateBio( - userUniqueInput: { email: "alice@prisma.io" } - bio: "I like turtles" - ) { - id - name - profile { - id - bio - } - } -} -``` - -#### 3.1.5. Migrate the `addPostToCategories(postId: String!, categoryIds: [String!]!): Post` mutation - -In our sample app, the `addPostToCategories` mutation is defined and implemented as follows. - -##### SDL schema definition with `prisma-binding` - -```graphql -type Mutation { - addPostToCategories(postId: String!, categoryIds: [String!]!): Post - # ... other mutations -} -``` - -##### Resolver implementation with `prisma-binding` - -```js -const resolvers = { - Mutation: { - addPostToCategories: (_, args, context, info) => { - const ids = args.categoryIds.map((id) => ({ id })) - return context.prisma.mutation.updatePost( - { - data: { - categories: { - connect: ids, - }, - }, - where: { - id: args.postId, - }, - }, - info - ) - }, - // ... other resolvers - }, -} -``` - -##### Implementing the `addPostToCategories` resolver with Prisma Client - -To get the same behavior with Prisma Client, you'll need to adjust your resolver implementation: - -```js line-number highlight=3-13;normal -const resolvers = { - Mutation: { - //highlight-start - addPostToCategories: (_, args, context, info) => { - const ids = args.categoryIds.map((id) => ({ id })) - return context.prisma.post.update({ - where: { - id: args.postId, - }, - data: { - categories: { connect: ids }, - }, - }) - }, - //highlight-end - // ... other resolvers - }, -} -``` - -You can now send the respective query via the GraphQL Playground: - -```graphql -mutation { - addPostToCategories( - postId: "__AUTHOR_ID__" - categoryIds: ["__CATEGORY_ID_1__", "__CATEGORY_ID_2__"] - ) { - id - title - categories { - id - name - } - } -} -``` - -## 4. Cleaning up - -Since the entire app has now been upgraded to Prisma ORM 2, you can delete all unnecessary files and remove the no longer needed dependencies. - -### 4.1. Clean up npm dependencies - -You can start by removing npm dependencies that were related to the Prisma 1 setup: - -```copy -npm uninstall graphql-cli prisma-binding prisma1 -``` - -### 4.2. Delete unused files - -Next, delete the files of your Prisma 1 setup: - -```copy -rm prisma1/datamodel.prisma prisma1/prisma.yml -``` - -### 4.3. Stop the Prisma ORM server - -Finally, you can stop running your Prisma ORM server. diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/07-upgrading-a-rest-api.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/07-upgrading-a-rest-api.mdx deleted file mode 100644 index 2db3af392f..0000000000 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/07-upgrading-a-rest-api.mdx +++ /dev/null @@ -1,251 +0,0 @@ ---- -title: 'REST API' -metaTitle: 'Upgrading a REST API from Prisma 1 to Prisma ORM 2' -metaDescription: 'Learn how to upgrade a REST API from Prisma 1 to Prisma ORM 2.' ---- - -## Overview - -This upgrade guide describes how to migrate a Node.js project that's based on [Prisma 1](https://github.com/prisma/prisma1) and uses the [Prisma 1 client](https://v1.prisma.io/docs/1.34/prisma-client/) to implement a REST API. - -The guide assumes that you already went through the [guide for upgrading the Prisma ORM layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql). This means you already: - -- installed the Prisma ORM 2 CLI -- created your Prisma ORM 2 schema -- introspected your database and resolved potential schema incompatibilities -- installed and generated Prisma Client - -The guide further assumes that you have a file setup that looks similar to this: - -``` -. -├── README.md -├── package-lock.json -├── package.json -├── prisma -│ ├── datamodel.prisma -│ ├── docker-compose-mysql.yml -│ ├── docker-compose.yml -│ ├── prisma.yml -│ └── seed.graphql -├── src -│ ├── generated -│ │ └── prisma-client -│ │ ├── index.ts -│ │ └── prisma-schema.ts -│ └── index.ts -└── tsconfig.json -``` - -The important parts are: - -- A folder called with `prisma` with your Prisma ORM 2 schema -- A folder called `src` with your application code - -If this is not what your project structure looks like, you'll need to adjust the instructions in the guide to match your own setup. - -## 1. Adjust the application to use Prisma Client 2 - -For the purpose of this guide, we'll use the sample API calls from the [`express`](https://github.com/prisma/prisma1-examples/tree/master/typescript/rest-express) example in the [`prisma1-examples`](https://github.com/prisma/prisma1-examples/) repository. - -The application code in our example is located in a single file and looks as follows: - -```ts -import * as express from 'express' -import * as bodyParser from 'body-parser' -import { prisma } from './generated/prisma-client' - -const app = express() - -app.$use(bodyParser.json()) - -app.post(`/user`, async (req, res) => { - const result = await prisma.createUser({ - ...req.body, - }) - res.json(result) -}) - -app.post(`/post`, async (req, res) => { - const { title, content, authorEmail } = req.body - const result = await prisma.createPost({ - title: title, - content: content, - author: { connect: { email: authorEmail } }, - }) - res.json(result) -}) - -app.put('/publish/:id', async (req, res) => { - const { id } = req.params - const post = await prisma.updatePost({ - where: { id }, - data: { published: true }, - }) - res.json(post) -}) - -app.delete(`/post/:id`, async (req, res) => { - const { id } = req.params - const post = await prisma.deletePost({ id }) - res.json(post) -}) - -app.get(`/post/:id`, async (req, res) => { - const { id } = req.params - const post = await prisma.post({ id }) - res.json(post) -}) - -app.get('/feed', async (req, res) => { - const posts = await prisma.post({ where: { published: true } }) - res.json(posts) -}) - -app.get('/filterPosts', async (req, res) => { - const { searchString } = req.query - const draftPosts = await prisma.post({ - where: { - OR: [ - { - title_contains: searchString, - }, - { - content_contains: searchString, - }, - ], - }, - }) - res.json(draftPosts) -}) - -app.listen(3000, () => - console.log('Server is running on http://localhost:3000') -) -``` - -Consider each occurrence of the Prisma Client instance `prisma` and replacing with the respective usage of Prisma Client 2. You can learn more in the [API Reference](/orm/prisma-client). - -### 1.1. Adjusting the import - -Import the generated `@prisma/client` node module as shown: - -```ts -import { PrismaClient } from '@prisma/client' -``` - -Note that this only imports the `PrismaClient` constructor, so you also need to instantiate a Prisma Client 2 instance: - -```ts -const prisma = new PrismaClient() -``` - -### 1.2. Adjusting the `/user` route (`POST`) - -With the Prisma Client 2 API, the `/user` route for `POST` requests has to be changed to: - -```ts -app.post(`/user`, async (req, res) => { - const result = await prisma.user.create({ - data: { - ...req.body, - }, - }) - res.json(result) -}) -``` - -### 1.3. Adjusting the `/post` route (`POST`) - -With the Prisma Client 2 API, the `/post` route for `POST` requests has to be changed to: - -```ts -app.post(`/post`, async (req, res) => { - const { title, content, authorEmail } = req.body - const result = await prisma.post.create({ - data: { - title: title, - content: content, - author: { connect: { email: authorEmail } }, - }, - }) - res.json(result) -}) -``` - -### 1.4. Adjusting the `/publish/:id` route (`PUT`) - -With the Prisma Client 2 API, the `/publish/:id` route for `PUT` requests has to be changed to: - -```ts -app.put('/publish/:id', async (req, res) => { - const { id } = req.params - const post = await prisma.post.update({ - where: { id }, - data: { published: true }, - }) - res.json(post) -}) -``` - -### 1.5. Adjusting the `/post/:id` route (`DELETE`) - -With the Prisma Client 2 API, the `//post/:id` route for `DELETE` requests has to be changed to: - -```ts -app.delete(`/post/:id`, async (req, res) => { - const { id } = req.params - const post = await prisma.post.delete({ - where: { id }, - }) - res.json(post) -}) -``` - -### 1.6. Adjusting the `/post/:id` route (`GET`) - -With the Prisma Client 2 API, the `/post/:id` route for `GET` requests has to be changed to: - -```ts -app.get(`/post/:id`, async (req, res) => { - const { id } = req.params - const post = await prisma.post.findUnique({ - where: { id }, - }) - res.json(post) -}) -``` - -### 1.7. Adjusting the `/feed` route (`GET`) - -With the Prisma Client 2 API, the `/feed` route for `GET` requests has to be changed to: - -```ts -app.get('/feed', async (req, res) => { - const posts = await prisma.post.findMany({ where: { published: true } }) - res.json(posts) -}) -``` - -### 1.8. Adjusting the `/filterPosts` route (`GET`) - -With the Prisma Client 2 API, the `/user` route for `POST` requests has to be changed to: - -```ts -app.get('/filterPosts', async (req, res) => { - const { searchString } = req.query - const filteredPosts = await prisma.post.findMany({ - where: { - OR: [ - { - title: { contains: searchString }, - }, - { - content: { contains: searchString }, - }, - ], - }, - }) - res.json(filteredPosts) -}) -``` diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/08-upgrade-from-mongodb-beta.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/08-upgrade-from-mongodb-beta.mdx deleted file mode 100644 index 6afc292503..0000000000 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/08-upgrade-from-mongodb-beta.mdx +++ /dev/null @@ -1,232 +0,0 @@ ---- -title: 'Upgrade from MongoDB Beta' -metaTitle: 'Upgrade from the Prisma 1 MongoDB Beta to Prisma ORM 2 or later' -metaDescription: 'Learn how to upgrade your MongoDB application running Prisma 1 to Prisma ORM 2 or later.' ---- - -## Introduction - -This guide helps you migrate from the Prisma 1 MongoDB Beta to MongoDB on Prisma ORM 2 or later. To learn more about the differences between Prisma 1 and Prisma ORM 2.x and later, refer to [this document](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#main-differences-between-prisma-1-and-prisma-orm-version-2x-and-later). - -The scope of this guide is to give you the workflow necessary to perform the migration and highlight some of the problems you might encounter. - -We unfortunately can't cover all possible scenarios or changes required, but this guide should help you on your journey. Join [our Discord](https://pris.ly/discord) or create an issue [on Github](https://github.com/prisma/prisma1/issues/new/choose) with any questions. - - - Perform this migration on your staging environment before trying this in - production! - - -## Requirements - -- Must be running MongoDB 4.2+ as a replica set (MongoDB Atlas does this for you automatically) -- Node.js: see [system requirements](/orm/reference/system-requirements) -- TypeScript: see [system requirements](/orm/reference/system-requirements) - -## Installing Prisma ORM 3.12.0 or later - -In your project directory run the following commands: - -```bash -$ npm install prisma@latest -$ npx prisma init --datasource-provider=mongodb -``` - -This should create the following files: - -- `prisma/schema.prisma`: An initial Prisma schema -- `.env`: Environment file where you'll store your connection string - - - -If you see the following error: - -``` -ERROR File schema.prisma already exists in your project. -Please try again in a project that is not yet using Prisma. -``` - -You have likely a `prisma/` directory in your project already. Rename that directory to something like `_prisma/` and try again - - - -## Find the Connection String to your MongoDB Database - -Next you'll want to find the connection string to your MongoDB database. You should be able to find it in your `docker-compose.yml` file or on MongoDB Atlas. It's what you'd pass to MongoDB Compass. The connection string should look something like this: - -```bash -mongodb://:@:27017 -``` - -The database that stores application data in Prisma 1 is called `default_default`, so we'll add that to the end of the connection string and update the `DATABASE_URL` key in the `.env` file - -```bash file=.env -DATABASE_URL="mongodb://prisma:prisma@localhost:27017/default_default" -``` - -## Introspect your MongoDB Database - -You're now ready to pull the structure of your database down into your Prisma Schema. - -```bash -$ npx prisma db pull -``` - -And you should see your Prisma schema in `prisma/schema.prisma` populated with your models. - - - -If you see the following error: `Error in connector: SCRAM failure: Authentication failed.`, try adding `?authSource=admin` to the end of your connection string and trying again. - - - -## Touching up your Prisma Schema - -The generated Prisma Client from a freshly introspected Prisma 1 based MongoDB database may not have the best API. You can adjust the model names and fields, just be sure to `@map` and `@@map` the original name to the underlying database collection and field names: - -```diff -- model posts { -+ model Post { - id String @id @default(auto()) @map("_id") @db.ObjectId - published Boolean - title String -+ @@map("posts") - } - -- model users { -+ model User { - id String @id @default(auto()) @map("_id") @db.ObjectId - email String @unique(map: "email_U") - name String -- posts String[] @db.ObjectId -+ postIds String[] @db.ObjectId @map("posts") - - @@index([posts], map: "posts_R") -+ @@map("users") - } -``` - -Take caution in doing these renames because you need to make sure the Prisma Schema still maps properly to the underlying database collections and field names. - -Unlike SQL databases, MongoDB doesn't have an explicit understanding of relationships between data. This means that Prisma ORM's introspection is unable to infer those relationships for you. - -We typically recommend adding the relationships by hand with the help of [this documentation](/orm/overview/databases/mongodb#how-to-add-in-missing-relations-after-introspection). However, Prisma 1 stores foreign keys is different than where Prisma ORM 2 and later expects foreign keys, so if you want to take advantage of relationships, you'll need to shift where the foreign keys are on your database before adding the relationships. - - - -💡 Download the Prisma VSCode Extension to provide autocomplete and helpful error messages as you transition your Prisma schema. - - - -## Generating a Prisma Client - -With the Prisma schema populated with the schema of your data, you're now ready to generate a Typescript Client to read and write to your MongoDB database. - -```bash -$ npx prisma generate -``` - -## Testing Reads - -Create a simple `test.ts` script to verify that Prisma Client can read and write to your application. Note that this guide is using the example in the [Prisma 1 examples repository](https://github.com/prisma/prisma1-examples/tree/master/typescript/docker-mongodb), but the code will change depending on your application. - -```ts -import { PrismaClient } from '@prisma/client' -const prisma = new PrismaClient() - -async function main() { - await prisma.$connect() - const posts = await prisma.post.findMany() - console.log(posts) -} - -main() - .catch(console.error) - .finally(() => prisma.$disconnect()) -``` - -Make sure `ts-node` is installed globally and run: - -```bash -ts-node test.ts -``` - -You should see a list of your data: - -```bash -[ - { - comments: [], - id: '62435a83fca136000996ba16', - content: 'https://www.prisma.io/day/', - published: true, - title: 'Join us for Prisma Day 2019 in Berlin', - wasCreated: 2022-03-29T19:14:11.172Z, - wasUpdated: 2022-03-29T19:14:11.172Z - }, - { - comments: [ [Object] ], - id: '62435a83fca136000996ba18', - content: 'https://graphqlweekly.com/', - published: true, - title: 'Subscribe to GraphQL Weekly for community news', - wasCreated: 2022-03-29T19:14:11.369Z, - wasUpdated: 2022-03-29T19:14:11.369Z - }, - { - comments: [], - id: '62435a83fca136000996ba1a', - content: 'https://twitter.com/prisma', - published: false, - title: 'Follow Prisma on Twitter', - wasCreated: 2022-03-29T19:14:11.375Z, - wasUpdated: 2022-03-29T19:14:11.375Z - } -] -``` - -## Testing Writes - -You can then alter your `test.ts` to try writes: - -```ts -import { PrismaClient } from '@prisma/client' -const prisma = new PrismaClient() - -async function main() { - await prisma.$connect() - const user = await prisma.user.create({ - data: { - email: 'alice@prisma.io', - name: 'Alice', - }, - }) - console.log(user) -} - -main() - .catch(console.error) - .finally(() => prisma.$disconnect()) -``` - -And you should see a user was created. - - - -If you see the following error: - -```no-lines wrap -Prisma needs to perform transactions, which requires your MongoDB server to be run as a replica set. https://pris.ly/d/mongodb-replica-set -``` - -This means that your MongoDB database isn't running as a replica set. Refer to [the link above](https://pris.ly/d/mongodb-replica-set) for steps to resolve this issue. - - - -## Upgrading your Application - -Now that you have a working Prisma Client, you can start replacing Prisma Client 1 queries with the latest Prisma Client queries. The [Prisma Client Reference](/orm/reference/prisma-client-reference#filter-conditions-and-operators) is a helpful resource for learning how to use the latest Prisma Client. - -## Conclusion - -I hope this brief guide was helpful in getting you started on the right path. Let us know if you have any questions or issues. We really appreciate your support over the years. diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/TablePlus-GUI.png b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/TablePlus-GUI.png deleted file mode 100644 index ce3615ae53af6f05f92742cda1b7e6c7f01ad605..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165631 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 z zJg~pK_khEC*aS?^rG1mYm;H~5&v9YOKA(q2A8hJY?$Bt#F+wHJ=rm9M%QBV!Uo2Dq zBWQ+vHXSrBhIRkHyU4p>dq#1((KgPZ!JsuL(Jk*qqA8o8lqJWgy%c-*D^YgJsVWcs zR+&E@3#9o^D{UY`VTa~0dgoiQpNSgbBry?r%ft7RGvmKfi%t$}CaxGLFS~fsbbN0e zbDliApq%4YB5}YU_MuBl^r>I_{{w=mJypgbof;LJ*v9$&=6mO)GrpZ`I^Dh`TQ|Cw zTd6-7oOV&II+w0wm}gd!o2v#y!M^P1Mi)-zqhq`$1pX5a>f|uo8Ha_BQ$on2xQKDe zIV(c$sf=j;XQFj2m@xjo?X>6{zboRgZ!7679Qdn*euIhhCO4AqO0L%* zc4V`&!RSkskIUP+`WME+;-uO*QjaQiDH232({ZUAq#;5MNb$sUP)(qlas;? zxXv6)nDxKAsyu~d?T8tMEGF(`d?Dvws$4&n$|WX||M|iziwbV>yB41Yy~xVB>A1#4 z^4SUfB{m9_VxUA4k4?1R^^_(mMkdEDTQm7Z&ruw4a9rl=y9kAf44)1%bTvS2q4End z#L0yjNq?-(4cu?GIV)|Toqnr1L(#hp^#9duP(f#K`%JAl*IdD+0|6z$?}{rc<=CJp z{4gsIq5zMpkOY_2xpUWhkB8O==AQhun5~*UP4IR_1}BQKV~dCPb{$#l;BTv@IHpFf z?bzP)-l2Q86`KoeZB=K^Mh{gbgXpJJIh@VyImNR=HWx2cv1pT(Pr67XbB8I<7--O# zTyaP5Ym)ch)^HncfIdYRJ_GZQH=7PBv-iC_Wy zW*Q0ZvWrVd8QKo~a3K++4Gp)#x!5hJ%_Wg3t`p?`G&g9F$_jKLUGPIlT3P|||9p;+ z(0v42c>#eIY7(!0oW*S~H`^_ayi%yjL2bd%;lpwv4E%uH2pWPZmajxp)5Pk4LzWJ> z>wd@wciN?!u5f+1n5Xcshx9Pt9xwG}vg#@rE062sNp#=g!s`nZ3t$Ilm*3ahtUvl8 zQ);@(_&(#pTbM5Gw;GpO{E!zr1bx_y0hu`&<|ZV5teQeh$ik`)txsVYbdoeS9fPB()Md`A|rNOqR&eY`@AL9w` z`JxkLb?&?pCk6ApOipLUM)n!K=;h-IblXhT66xQseNc!=kH!tXHrscm5HR4YUtYhu zKHIDBzjTY2%;GjWAXJ7Sj$yP2Xns=?+Vz7mi$ILt{P``p@ZI9f!`(p`2aNL>u`v*GjLEp%}bs(FG@Wrj3mP+C4rJHL54y!e%EOOat zX;6_iCh9%BjA$X(7wm=E^?PDy=g^Zs*-r+ouMoqan_nx|6!B}-bKv#WE?Fz7Fea31 zJ{Rl;O?1=1wT(o3tXG|9z~i03jhF--cbz9B4dR~$iP&OqS_uu(ec}oe5`QE@-9(g7 zf9MDtaDCe=(A&rPUNI3F$(T3zt$S0Iu>BlS4^uBGZ`_*Z^jZsi4c6{LMuR$sc~`?I!7q zh=(Z62@Uz9g|`+o!es51n}1F=2OP&lwdS@+7A&;?@99=B+k|~g&k?QgTBNrahYDSUm7K#w_Bd4<9c8yGQ1SN%A5ru_MRwfv7^^i#}mP$W_9|ZyO;+F3wx#f<+mZ1>RF?1MNk=> zin7~Lub)WF$|`CmzBcxXEm_c2%K%L8yz3XUHv)4xcLP##(Y}Lw=K5T@*kix_9P{Ak zNKmQDoU;%g*Y#dbSbf_<|eltN{ZWGIjdIloIyKUWXj6TE43|2+?ah^9` z`RZlKpPxP4_2n$EX%T0|Z%90o@C)T!stY1TjHvUKQ9|NHH7oc+9g0y3hLp54QA8!! zmmX})%D6@BjftU=qj*O_6rp1Wj$c#%?T z;kb<&$)R)z30B(q@xfFp`UUsb;~Ei1F9{9BU4U#TAB_r!i8mAbF>Ps>pU3SkC;#ze zm0BU~)p(F~zFgqgreT5-WEvTbAn9FWI2~v%A9ALZ{^(q7JuPE!dh1)B-N#ZGsk(`J z(bTxGhD-LHYXK=i`B6KNnX;?TJBH0U(HxH{`okhfX9f9}xJH}gc9u9M8v`RBiG4om z_{NJXQcBN=wWg^d80)UI#y4tw6RWNWd> zen5P_^1{)G&E?ntF0NZDJrRy*2z`o(A^&Maf%?XJd9RQ8P7JK()Fe`Lr5mnr`6%55 zFxf{pvrHUQqNAXI5+DZa6`ZK7fP$ZJHCkEED9L1#S=vthww|RGUt~o_!rS|HLC!#( z`F$!+1Zb|Xo=4f<^x$iYi+r0~uRPux8Lc?cs>rD*en=r-91N8IKBRI&sls2v$3TyO!uf2JaU6*mYtQ&< zOXg-PlSJc=F75nN7XLNw{1eF}+W-j>(y#aA-zD`QimR+N!}mm=lEyJ~UYPl8Uw%W` zL6NEcjvFaUy{bG+HHUfWCT^2PH{Gsu8CLKVUKn|$IDPYZrmKQ{pX%%}H-pQUbB;$! z5yc{eNSGy7`=>& z*iUPLdCx_M(b@{zR~Zr^HX_AFOa6b<>c}zAH3|mPiI@#ZocS3UD6|EIB;Gb06~(Rf z`5qua?Uc|Q5O|@tbQ1yG4P0FQEm~(?6XFKX?cHN&DO*(##|C&7GxSX;oJ&goW1+pg;{$EMu*+l9a zH)jxIfB7+p;ihV(eve$!`8*tclc*vpC9mTNT)?rN0y#e@8;F`~Ql|X;iIi=ovCn6omz(&qk zAdCoPds4;_NEw3NPHpj&`X)rE(=mx{dx}{38O!!n5%Z(5e&R*?Kd2i{gFs%>$&&4p zdrc{}Spbp%<6-8|3f#sIsij}cpD$$*2m2JzONTDhV*_>cB>I~<)k8`DL-NNyyT9L~ zq@*whCS09k7LZFD2oeUBIWdZuhVb)&EBEru(9@kAlI8b$R?L_m9NEU?6vPffdMO8k z*2QIq+-@NS_6i&acLBK2`%EO+{JPohHGQ+69E$-Cq9Kc^p9qS-s>JVs#o7T%b?=se zrUGgnJO%%KYRff%xU~L9qy`K~--N<))oPd?B7=l-E}90uSf>{aN$OuKn8{+ql}v>) zOW&7qg{2UI4z9e{6+r5Z2V{4c!1hhj)OuHVc7iC6FSoMt8g~s0dPms;qac1d!YA5K zZvUWFz>X*TkxPLF24Vq^)TPSf9RgmdNL5*6!ZyC3*8(2ZNsWiu*FP?<4UN4XO5f#9 z+nexu8YQuOvVR#l22XIdH4`Tn-sFiJ`ZE|V$~5{g4SP_F>X8o#cAp=4Y})(XzR4Ya zd+Icun`2mW0-s&7+Nvxm4MOD;qBV!!KnO8cL2T&L z`;1%2@GiRqy2bY|94`*M_N#u$`OHyTTDtoGV&=0oO(q24&Sx`VmhWH7mOD~())J7b zPq?v{hqL<~W6q>iTuzj;)OQVfss)A6xN@bR_B@u^?;ux^zJvMv@mO=8FMKVdRG%)kyWuH39S zH)3M`B&MN{aK0_s@vtonk8u^gX1jIePdG&%WWN)*#d5AK?Yrp1Gf;&(JsVCSzuSm} zd~%!s@|go+(ZQfPJ+ag&`=te8fSIVfh&$etgBMNMn2wf}zian<)^34>rXIhWz}v5K zSKb};l{Wm9Plo}dHZFCIu9mo>;G*QS zkNd>0)U6E67_F#|9xLyJ8Jk76w)jcG`=ra3mj<5>3qKq(12+?+fYzyG35)AD>p14r zzoQbw@29p2CY$Hly@T@gF62z#4n;>dHT0A_n~}#8#lZ;eB|XD|@mv!aqYm*yD@XfQ zLrs&UF+>g`oBqo8{3|#P$q|yja}4#NE62xx0%Ca%K!!c9pnNJ>Wdt6g{0VDWQV7MReHMrSBqeRzYpBC3ibo^PEPR#7MTL_s5D54Sk5)BR#L>#HjYXf zdt#HA9v*Y4XW}#Dm`eGXefh!81!K0^6C)@J)V%5c?mPVSPDM&o_qX@Zrx$ZQ8gMVS zT@L*67BygMOVqsooJ9}}^ge>zq%7Fo>VbabnM`=hg$Ez+>kfStsgF1x{x)YCty}Pd z|KHt*|8g9rUqHgHAy(`zLkin(x1n<@*3giV8|=^0X{8%BJ1gTSAwka8aDw&1`XrKI zfP7WVVzE3B>E>m&2Yw)4tz@NYNI`ruA^+$Y%4DVE(jhpsHDJgpXp9u^vb}p5pF8ag zscCyj(^D>cw5Qf*Mbv!}oEI2|n*cmyYXz{l>ljKs?XTcAC;=q?q?_8+?g{*)e@BWK zpwN#VKu62Q{TFug$Amb>ktL4iGA{Lh&wdJkRpf399sW_AJOSL zdLLk<^dCxSO>$$H0G4}jNBxfT-{8-MJ@AL}udI+NK6oAymiN*|5O{+dKRLp5)?J!m z1TElJ0EWcjO!gzUu~COd@08u-x6EglGO z7S2Li%9(Q-n`NJ#Ot1Pr%+2Lz^Krg(siyC$5MR`JOG}9pS&}K#D&ew}5cF~8KXV|? zt<2eGr#y{^tU+Y1Z(yd*_}hP|jQ9@`=1sO@s>I60^PH;;ah;qi7U!JJR{1qKA)%$` zzV<`NdE=#JXt2G+70NO@Z(`8kHp=+U4TNNA$bLrTY;e_ET_`kvGR`gMrb0zU^@D46 zBZ5RP^v1o?{;wF@zb7{Xq6n)5Y1Be*a{51Zf+;l6+Dly?l`)jixMw#sm^(2jJZyhn z*(;0rKv{mS_QA|lU(+d+ao||Q;e!;~V?$NgNdN|tftPBB#N~rfYb889ojhY3NHix? z*R97e^`d#4GD(gz1>VeBn?<`nC2=6;F(35bS?%-ak|#`8L9+Ipyi8wRVNN;LY(B5Y!OzO`VYRA_Ib3HH>_LfEJ2Mxhuf9KYI}(Z7 zuOnn*dJ*yBfZ8wrVk^6Hy=OV1;H&Wy)y zbZ^sLxwB;BjsnL3lkQ-_?rqt9ds|e3jK+fA@3}rOkQZ0d>w#(bknk{ZFmSBxT6TE< z^*T{)U0u6RJVmef=?#I57`A&}s69VuY)m1LUnmffy?_|VVDXGJt?^Y!6-WB(IS=+<$wVcXoE5%was)^z;L$*S$7@ zr<#Oe#MwT+7z-$OU24B~DcT|4I=;!NDcui`^glfd|IX_(O6(`eM!2KRW9UOk7=t%` zfg2;khlI1=wcf@PAl9FFm%EeX=oAFqA*@m3qIv4wz3nbZy@a?AqxXDbU|HpkV7CKt z|U@(#h zubG*9VP*E6@8bzijPefmSC7XiqJCWVs3VZ5gzxO9=lMuUw$Q-4Gp+sd1b;~Uw-bIp zr?Glkf#D$VJx-FbnG56bJ(cqg##@sx)#{Chd{!hhuM&DwX0f1^T;@A{q_$4n$U z{v&MZePKPexV@}Xup16h2=L~BFr`2kyaZaGqiY02(Q0a6cK9PPaGgA5VvIIvDv%Q# zq`zUSV)^horPC~`|2XlUd8}jkiQ{tPH_$wv!lM=mqa~4+YB(|TlN7=Zw!-x7#gc7>IzG3aDz&Ss`e_Kg|ZVGrH)E=)I@>zl#j$mr4nO?}z`e0K(?ThG`6*VE$fx z^V*`r<-98`Cu=1?9dM|zWDU;Hec0BMkLVuplB=$Oj8hZj&0Hiu^BZ7 zPX*v}_o$g@do4q-?mItMOTFezorg%g`FkxUG!mNra}7g8-z0`xGEqLQ9ok!}R1S)x z)`)Sp%IsSCvyt&cWlbJva(TiLELiP0tMB9kf(F>b7hkPs*8H5wr=spom%ktQPLIs( zfVI8`k)|FhP#)}%=Y;uqh}n@)!lH{sme20KgH8*caXAiR)YqG2n4>P56KeO9AiOTm z^cpSk72tPtpA4i3b_QCzpGqdk)ovYC!X%*lTkk*aVCn0yhSFrg*7mZ?)RdLc@LtUa z)r>f%!%GI^^xvf*bxGn1O+`yCKrOM_E@RLh@`4$xa35)FO&nggD`Axh-g8UcX*=H~5Ei!kJ z*)I00aXNjo0M9N6$5;I41Tc`re&fIM7!`4#%ke!q8)fLzdw~!AARBQAV^+4+({wY< zUbf{J4<{fzyL07xZ26fJmL}w=l4pH$PwmCO6y(2qPp}NK`8o9ybyT9?RDyZrTK41d z42)aY0f(bn#C6meM8(d4QJ)1Ic?*f)u49Z*tE5>D@7qUWT>}m0j6213?8pnpz`ydrA<)cI?D4t4brpXeGF%KWIAlW8fG3l0?6}eZerXrJxqkVUUqtZCb=A>mO#e6iMB!m5K0t!lhs;w14+o&qiUTo^DK^ zlPHZwPi@j$!m3m{&de zJKh5E?%dKhv4-#f9S^iZu1KVSZss$Up4ONurib?84K0I+gq!zwcHMvJ>dRnaa-WPF zznrABtHgpNGbRK~b+9)lf!k#PZkjrjckp4`ZvBJ>&ackD@hc#s_EGiA znG+Q=7b@4Sy0N^f3}a)PMkytfqUaK4=w)EGoHPn`qjWS>4yq`bsDjn}D;u0O+^_bO)^}KHKM4@@0*|b8u*K)G$vF#UX zznIJ$lQEh@ei3H7mGj*Mh!h|Xwth5o;)*4vSVCggW%xvuWayv8R>+W-LRYR27 z1^YQ2|`Y#d#XH2HWDu9C$dHy)}ea+@WfD6nV?&Q zxFovJyh_a@ckc%TA3TLYHRep`RO-{}n9L}LjTLKAjln$l5T(4c z*{!AP8S56^ioCX010vl=*B8VbI&OA%MzedFU#mj*@}v2wE{IYTo^H#f%lg-k=G6S` z_3iybof~5hOD*-+3<^G}yO$l{>t0>KIL(T6mnfmU`!9z%i;J8#C2y?4+E;r!bYcl7 z%HBuwRDaG``*GO&T2dZ!w)jcq_WN1p<2=4LC0mz9I)dbx>!q;~GQDNzZQ+*-LGMJ{ zPK94hbJmiXZrQv4?OtWh4z_z&InBd0KHE4Y%BH_rjfAcC#od(i_()dCHRtpYij)L~ zQ|vl@`HkwCgV*R9FH^#GGfp-f!Wy*Qa|i=?``dKiviC%+-dz@s0>R&P9j5(SxtsP8nsUk5O_Q()E68lt0{R z)5dhBsXo(qmglBltAeUj^5!PME!Pp_4wS}QD{s32eHj8MW^|!;*MEKbe(aQ{W>RvS zoYP3uq_kxu6|S(H`dmhKKYlTcTs6)$?XQK{?q%bA8p9=M zKk8YBHMPZdH7}?w7A$?fl6wP<@DhTFw-)CDp7@EE^9qsiH;i2Wpl^9@!kdX|K*%69 z?)xGfHSGZ%O8LqC`qK$v*5~=Uxu2y^;(VgyQSCUi*LnG{vFrz81Du-lPj7JCEj_Y- ztYZK>JX|F1Uh#V6qW6~QZr^ay&W-Qw0iC~gYJVx#9INPf{bl2Qp38Q^?S&m&nMd%L zlO%&jPc)D6XBf`9{My=DtX&-OTek?fy8%4ZVt@_1H6OnK$)O1>n#B(sUz=Z+osI_G zadw8ojxKS&3?6%b^K24_f_B@A*k7yLGl&cpz2+JrCyd8Kaj~XsYn*p?y7`q53IAin zEU*AB`>sgr+8`XBr*t~vMt?SqKS9Q32@^Nr^9vG{*Jh13!(ESX;JKKG`ya){UG;p! zaxaY1ue=bqaXA_LM(rizjHUmkon&^Yl~DGIqBHOCMMeJvZTbGPmCfi?q(!TMGW-Vj zn;LF?^aB?sn=$Kim`U%M7WwdZI)fpZcb&!1F$HRvp+j0NSnb<9`1%iVa8co3I6qyc zYjnm7+UYnZIn+>FW&FHzqiVf7)74=2oqn2p_bV2$8#jLLFI*p99}*p~E3&PvO_-eU z9$6pAA&>?0v;IP|7`*37n&}Rps^nr77vy$1+ehK?`Syy1Z=ow(V=8e268U^&ZAR#7 zpd;J#u!PyqI?N|FCV}awta#(KV#@W_B+~}RYJU%np0Ox*q9-4OE%Rzf=6+a%ov`z| z`>EdPMyw}_vjt@}S8iAEZ-u)xmb{!RZ66|~R~l_r5Ua16f=QGotEEp4@9FRCZ^Tf{ z`f~N(LZyB{FnCSg2uRLjnn&mO%PoArJ$#)G2+-TuC(Bd~r&p59T$bNX0Zz636Pf8) zWzAnvJi!!nB{&=RYdN)K0OBvcO1zxruRR&{!K8ai2HtE>tD&ME2JK=oK)b-ktm)Fn z@9;PNI9{U9&0r)6=BnBgTW!)z){F`ef`VJmJGs-E+<4;biLK@LrzJO?yX3}cyf-J4 zt06AueP3*`9Y1=&)jzNBc+zueNXuHB4S?{#m#_+Y7e$-fLb|*ta9zLVi}*xNALHxJ z2^$Od`hgJ>MtccO=A_uGx*wdt6;^Llbq|}2U#OI6es*2<)%Fus=3Tj8SY9eWtt6i# z{D(5P<~+RVzKfrD)u#M&N_gQ`P1sm^O?Hb}Xg!^xld|e^i$LrTSpyfgn&^#zZvUy| zc|aBS^Eh8ESJ+-c}1K#SD$7NL^5v&c3z%GelpY|Eoz$|5ioq&NHi~?LbJV%BUC| z9GtC?U#cU0RYrfwU%TmBcnrnWkEAzXP^vy6&{Mlej@AH#24XQQlCOw67O5aE62fi zZUGWcEtxKzWKcUJ_m#|wex|-et44Wyss0s%PAWxAcv!kwLPTIV53)V_R(E`>giZJ* zGx(!ho1q}defekOqK!V;p)z8P?oea?`xkFNH8E4`Qz?$%N| zo@F}j;&Pyfl+%ymccxQkdBSnYP@ zvinb|G8SoQXs$6YGiY-(wTF9#TZoPK^9Ay)F_tvHj51;1W2{*^LZj|Iz@p8mA=lL9 z)V(~xmgzh5#PY~}Zes&w24cp}4ep*8^ZorQl?ZP1iuIs@GDUp2+f>gLz8(tasCKuF zoXmv5FJH2Fca3C~XxMkly0^R5D4tA{e`Iz44sz34F!z>c9r1o2zBtc;i#5Un7uT|U zxnSQNxpilmv%KHc>7c|twzgkJ+WvX|2@%G+xH(=9^4wX-FxvLz;;d14!a0j!UE|KV z9)8H~YDgGtd_%>0mDs~dC`U@%0@t-*{>+HxlP^9yxV}Ctj286oQr9aCsH(4wbe%&{kb{+98=<3@5SAMe{E0s+LG$;s&p<|rr)5B~ zcaLG}moJ}WT%!1*dDMm`>LPcoRNojF;pSp*CBAVu5PD=Mx${=|Xrn{Zsi=BNQmrK$ z&UA0LIaL+)qh(}Adz@uN03$uxhJ`lU>Vlrm^76KSN| zDw1i|FtHcOgbGKob!%uSK2lH@t)pffCdyfab52)g$KHe&<440!)JbJa?5<^>{FJMWA``o7e{+<_|2xws!CwtuN~?E#?yx;X|iziuGIvhTPmwPCX-+ zct146fbM)@!ZiaQD4~A!ga%pT4B>J?uUF!2r0VoC``p#yCED**YO!O_KFkZ{XIQo~ zB_4`P#wE6}gT`MY!Wf!r0_1u}b6VVeVBdRH!8Mj@cV=2p<+aWd5-Yv}` zvnJ#lXP1+Gg*|CA#(_6RiNfO}^)j6yZBKly(DBd_-|ZI~hbcTLJVPV}B={!`FQ%0- zzB%Cj0~E+*H6As7e*VD>k2aBCGVKf~li2aVjc}ES3c=6BHUVUs((*Qa2U?A}`(@h> zP7IXFl%1r&Cp5lxQ;G<&{UT0J+8nrgg}UoJndY1>M(6>ryFKiLNc)_*yw9OAzZOn% z4OIz^kdqpkE{Da&^=aBG-{;zS=uZOD=puRz||##bZc=!h33- zR+e&3=hEG5W1~JDzV6@sPB4b`6h=%8Jth_Qfo7b6`l8kq^^JNPdg889TCk1g_|r7F zmmIN7cVauuN`(^&VGDX6a{M|)Tf^yhF;at!UY#3*@l_0KdbvzZD`M(!u1iDfe#7qg zf)Gj*wk?^YJUtZ)21a*|F>ej6slW-PBW@>(Pf`TVk$Pq;@v~5#vEQXBxV7&Rdp;wI zkyAcPj^|^TO~WsKvU_3t1bsFhcvoCfb~@PM5yQ9=HQM4qyp-J!rRm$ocog-exJ2Z5L08(nQ@cOMcbdE7cEEoF7q_n zWSM51Zj=5Hrg-DBbh3MDWF{y3+ibg{nVFdt%gCV=H`S({)Gx~_w(y?2uQh4$073)i z>oZfg6Ll_v4;{N(9<&kwvUW9+R~(#6rb&tS3|wJ4{@T7&`MJ|9Rf6*X&(m^pRrpVh zp27U%CQWtW#uR2zj{O%kPCO#7ze_I_?Ji>(U@L5|q(>n=5)tm^Gp~8KbTmp`ZV}|- zSJ_vNvpdKXPD#Gy&h*`yugGE@e@q(8uEt-Us(!~yrLMkL5|WQa&r#{k7w*RZ#0~DbajPwX0runa@h`gmYDc%Xa1k>?NI!j6PupraBfAT8Hj%aVkj- z@X+hTKOZ%@ni=EFkGA*FF^Nx6FA;@OwHd>LQoM^oQSR*~E#CvPeSXP^4n48CSk+^5 zvDy(EJhs_gxI}4ez*F{lI3`=pF35`TBkv;a&T@$g=BT8m#>pxEQD-98LzOaKz+u)us| zQ{UUi`2^z@#8gW<$u*nagj-JKgkQQH*y58?BE=I_5Sh~0pR!4rsz9^C-ptXYc6k7< zSCmXFWnfY?drv%tYEz%kDeGIsU)_GGPRTa#tmc|Gjr6P6*m5(W)T^U9pUCj|ImH^c z{46h`z=<_G-l?6?s}qRFlB7+O6}V>J3b|O8HBIKD$WLPGbu~nLCZy$*N&mx}bN%Tt zKGtKN;TxwiN^XarN~I{{;>{I)rl%x#l|IDmRP|EElm0{KBwE~p6ZE;p8ETo1`fbvs zabec?$QwUoT29Ky@}^EsO41y%llL3at(^-O?t7VL`SYW)qFvCLcWSvw>hM-1oZTLM z<;jD`k{B{xj*~qsM6}E<)gvt^8| zVjn|8bO}w37iU^g5>8IA+n&%|7|`)sNENeMFd2RHdMlIjq}`oeI;+`?lSjg=*JQY4 zzez64U*)B}r!IB)u*U}#u8^eXg4^64J)yH;6PUD=AuFEVBbL^-cg0A;u0;_7K_9OBvm#XcoTA5-TerPzr=2q zg^BrD*M*ZzGjD$mF6P8JSX-ef?&*uR#~89*;~tJ(@*br3r(eHg*Vq=t!`U0n6M6jd zqc>P|?@UgLuWHFvc=$uF$ho2m^c59i-IQTU&5WpBA?M(+;(fL_ z31M{83TEhX7;3|^EvU&ljE;ZC!FZ~#oaJ#7_ zjsOXwMQJJ9bDc-)Y0sk?XLOpa4`TcCX2}{4Z=Hx{MOiQ@;)0JnzjMcVAjw%d=lXT{ zNu1Zr5P|Pun64H^`D>T!VlW13iKEcXw9ltwv5ooB)vC>AK7xK>bl;B zIX3ypVO7I_m5I6i@xfzjaMt_hQW0_`168xl;oNm`tTPB38Q~Kv{vm&WI;{lp#PFLA`tQN zQRt4mYDu0d7VY)?EwnNp(P*!aq9UjHRHX*P*)v*lQv$QuC~<`s=n}I3d?P5kB^k=l z1UZdz;kl)zFiwMF-5EMm_{%M223HLAE?^1-&2bhjWq<7v6o?e8V{(`QrD!&wULvTL ziQFMSWt1Z`iu~`s1&yBajsKf+K)Q9<;$MS!EKc5Mr!+tEjC)WJ}?ywgqC|Xb^qy$@EJivpe z!m%{&^F?1kqp5-qK0hYCckw|(yx-$foq!t!e_obDopSQC>`M`#?jf~y47|=aRkr~ zk=yGFkGZbm$<#N&)|wLdnd0)y`9GtCiW+C-{cuaoI?Lf&>b(jZYe@)Gs(27)T@^>b zPhp@nL-%6o8udO|WY3T_UbuM@6ug^*e|-{I#g2Qc*zRmn<^QWYS|1fTjoczVhqEkp zIF{eLWyk~{tgR0sXlZ4u(VUG{4j5a2!q29S;mQmZ>#i65ff;&C2iw;D2V%L#4yq+Z zt{K^Er>Q%R8e%?HI}PwqK}E;#oO{k5GZq?>XXe4b2vPFxRmYrbDMJehqSt5-pz<|O zh(!MT+C(Zd!BVBZ11ns8>LpWg4#<6-h$D3P^76y{Bwp?CIdR7!%ks46ub|Bm_)FQ} zQ_;&oMTdRpEG8;#Qhqhqx=byzof5Cx#*e4fZHo^9+&uHIMgDt{UGK~>-cR2cjcf%h zu&cszhy2f14cbaeyG%08_P3qs-?(S@k^lGOqh42jkj6rl(a`PF)AM%ZnoP`_TOiS8 z?Ots7!va)8iVO0HO{BDf;Au_QSjYzVS=|IPhy2my;n~LZ8$_z^kY&MP^Vi;|#!aRf zqN;>qWR9i?`|7~NwAn?lYfq{or)EJmf+=eJL$yprGYbsYg}gYz|Hs!`heiE;@7^k% zLrF-30s?}Fk^@Ky(uhGxmvq-q!q6#=G%Dx^lrHHQ8b%Ci=o$ou8tHoW_>Jc|zjMy> zA6}Qk4D;T5?Y-7|-S;v~sp4BUpxfZ%JGjNi_r2rIe?#G8vY2yc;KUjR?^3WTWAW$P z>uf78*9MP5Om127kItDz8YlAa7G)d=1>b~nC4oYo=2Ny+E>pNoW zrzNp0nNV;f{)(0^@&U)7N24U&|7VZtLm&uQlKUc$|MTp;x!kykJ3gszTK@*$W6a<63-2L+ zI(X{}RW?$MAY#p5Dq`Ou@#bLZzW;Mn&736l;aL*+pI)?d^|t=4IRz3`VDo5NMnGS@ zO||yDkz7Sy&bfTNO+)H8`v?TFe}5wA^Kugm&Q`lpSrzt-OK3Fz0ykfBbN%6ozIwXg z~2V&2fKcHYc(AI3$Zr(k>DLu=F0aHZrF*53`?DyMQeL-E4+LdQ*t62-$5%JrK5#G&4sOeI|E^WTfT35>unMed<$6*n z6S$%F(b6Qx49u6`T1u2V$alCc09{Rue#l7V=&qVxI> z+Iz1S%`4}q7|UkVIRE(msMKuD-8nOE_H|qAWuVS<(~&IGuk0L`$7JVuTvK7(aN&K% zgT97V%3(Ocy`Llm+;N#fvaA9+Gbph^kCG~Ati>rwjHihjh2fDVTP*l{KjSsoa^GK= zv^w+?kuixPl+7l}IHGXtEMc^+Zd+Ggq~9adVHTRAzTbqq6R3kl;RsUnbmG6OZ zug?HVdwEcx_6vwyNzU?buJRWti{c|J@G$m-bHx1gRjff@tWIm9M0j|()WAqEfy;pS z7_yq|a0ERq9Z8y!s~Q)1{b(-{%v{=V&Gv(n(Z{XPs#2NlAv`+yN*(E6Tx^^y;dzlC zpmCaaoo$$>yfVCXt0&x4?FS-17Gzq@G_DRt58>_+vY{3VoXD3V)zEs+J}kpJxMnJU z2;~yj#>Gq)d668l)i8+cPCgo$zfCE4XjTT_@!^ddoVxuAZ z1(PC5!S%L}r`?OJ!}H%=Qz*oAy>2AY3?Fj=m6UEWxLBTRCy5Y>-MhT?WZge6W~Dpa zBGlr;ess}9rQk1FL;|ePx-QXN`Vlfi!O3V7w)UIpf<7W4@<2hj3-AJkjE54}Pjgqq z>R*8y?6*dfe<%i7yDTsa*OxV-$aL3l@Yj~5Ub%s0e1v?r=Caz)8gp zAW#Eom=?a!J`L`0DF##k*84!mkwhNc=9DV^LW{hz2FnkJ8h)5s02+J4z_*(0e-HW;3O8gMhPfqmS@oJl%++ zP9l{h_DV#XC}ScI6-jupYu4v5UUuPnzC$2x_6ATW(@jUE!Ff@O>~QK<;P5|-C)eCY zS7o66HnUG;p)sc52(&vI?$k{b6@0X_aAlFNoboQZqbi|r$(hr3$KNrAwX~u4F5L$W z{AJ};FqSm^aN->$Zs^x`>_lstz>gCVG6o@*n;P!ZRbgFcl4j`K=#4be7?yVmi@KlA zAu=bVB&x=EZlEp~Ij-=N@YKbr&sKWG4OKENt1p8SOdXC$Zy%jZRH;q1C2u2w1b8?i z+uSt#B-ymsLwrv`xA3HG)SG;;-XV3rLF_jk-V}dAf&M?kOF6W-b#=RpXVBx02VY$a z*nS%Fl>#IX<#4e3JP4GVsldl{l&g?jfG@Qq`Svi``tBVcEotvqEaA>V$m;}dJ~cX; z@B9_SouIbj^w3Cqip314HI@d5A{I%xDSDS(#@|!+=eQC#8Je7ETC4$$eK2mkgzF_= zo+k#My<--4p5|B>GzppT5n$f=ev)aK;0C~}{W(Bg-4TwPIM^@7knJxq1x~y5Hp(1M zi?TmD1%-afy{9#nG%s{&$Y;}P%1P3J&p=tCS^=a2UP3iXZ4jHP?2C@%k$$TePqX%hz)?@81^Rk{`h znoBdlnm#)}lEz3zM&^30v>3G^^=9We`Jvp`@*bTAAx|xkCq#HVUQS*N2$Xx`YEyG< zpnE=@8+7v91WG2e*D1xYHy^*1O|lmf*aqzJX10SbVZnKz!^!5{2`Aa`LtV!j-q$V9 z9JWB~t{L2zg*5oMQW!M~)-QEDKb*m^9Ggq)ogb42@&0?Lq|?*gS#GS31CN#>bdm7Y_5X9C z;289TepU*`x$8+wop@;VO@(M5Xu^kmv;>&?_6U7Ii_N(slpyS0oMA7ui0Gzg25pd< z*O$&YK@xcyg(rnhPFd$4s*yqNab=>0BQ`a0YT?4nao{Soen3w7fxMRa31^!xt31i zFUDc(>a3vmvnvUwOS3i6SOlYFjP!V5O!fkNdRX|Ka69$_G;I4boI>A5^O|Rh z>?^icN=jjlEuCnu4^xGL=H%QFI+m3-$kGTdk1w!(rGlw0epuXYa5KOkm{tZFE&htC z=-Zo}HSxg?i=W!w3%zX}_AWtc08E0u-R6=;9P_8#ac;P7`1LC%2c$79s8V>cQcG9< z%@W-Uo%?Sj{bhHV&uhSJWRd(^jPmgw(Ff+z4iM>*iLrEakNL58lu1`vSP0T>`Rz59 zF7~r|qAg$z*cbbj=X+LfSsK!Gb8?@t_En%5zLa#L<0W4Trfcp>UYK#$W~odUMv6%; zs5u`mXKBREJh#yU{ncYcvUmKo19C(}T5dPB*1LL1%@5aS%7*&6U%-5|ln9iiO^nAU zVn;~q11o{G5v5c{5$>vYhm+6wI>>ZJo*(@CW?BtR#3ch_raCoRq?`)yq?WVq>a9y& zfXeU}P6GIoALJ_GYe8vjoM_lafszbH?8)OrHX2<*VB}PII_Vk8CcyM5_DX9FIxa)aaP%l7dax= zo2%nZXf!tZ+3G@_@G&_*fU#dUV{RUF4RFLoVL$0GKk>mP-F}KzTc@V{%EV~wIjSsc z{Js6*NwT`oE_#hZe0sh-+O;X8YMgLzi4+l<^hkcRs(Y%SakfTYl1;(b!*^+6)M{T6 zNchgx8DW$FANSje;!fBJI|p0 zcqEN5qJdYB9iIUH0gU~dJx5-iC4$+E=Qt~v3`q}imVxA3?}$Bp3-+#khhEy*=Be<|SF$-p zwkt|+1M+06AdGUaleBXVjN4mK7HM9``9Pk^5+U94@O~mr$b8+te>s>*AUnU_jE<^l zC))>eFb=8dQ+rM8Dub>R>GSdR$Y_nV-Fw|P;-aL1Z!jVW+cIjQ`a~&vL^TH?X_@O3 zD_7DXM+|%{=xf!=x_7IMqV5xeF#cq4=fLNHlSjBQJPe_~4{_vCs}n?GKBW1fokiY0 z!A{V!M5IYuYX5^cioC)a-g*BeLn}$|wM3359_$4s!AD)})1Z*QF=)j+#(g%|Y~{y; z^7B~DvOV#L_K3)sAs%(?sxzM3jBWXIpE^O7--6$pF9o|W?Sb4!^9@e&wCWW6y`DSA~3%D(wF11xH%loh`v zMi0IO)zV0d2L^cn2y!+CZXA!y zhX&p)tkuu`ywtz#>HC`s#q26QhBJ(W0o_XJZ1B`;`IilMPL+*xF75m_8F~lTN50m$ zc`}_o4g@0O4J01(=BN!h;RMh6^}gNJ29%#Un@XyBprclaU2a*RL@`{Ii(|gu{Ndf2 zjsglg@}GFZ#C4UFt;sYbpZWR36z+;nc@21t1itCm2ltCjQ!ZBuPP5ENE{mw)QPj)~ z1~(F975%OHwcNNgQlOhD;cdvmI+*c&xW6E2TSOGfv|rT` z^e!RR&&@y~!L@Owt!saYG-kEq`70R>9VNcy3)RfKonKn?7bZh@27Jbp3lwkGG04FM z!8DXsY4)#i1yOdEhgM4bCsfc&-(n8qNsnX`Z)ywq5(5f2d(yfp5;py(@AU!;zKbYf=Aa|45JefwPhFhOUADr2zUVy2ojiEI)YR_{)#=YP zr^ZK^fC9=*TFf6X)aK9xzQo8y7vYfSO_KOIcia(4rZmD1f3DF7l&=00 zfP7leIxJ&$pkH$h)LO?RB8#9P-%<|cVhiQX^-SLO{XQwRx@NiO5{Yr*XCo#j)JKEp z>kg4Q(-D*(l^XLDB2ghFP?oZYiW}ps(GtPCvJO|tY!N9A3(sI>mDAVY5O~TU^+}BP znX$0+Y3@>cLDW6pFwOHdPthHV9i>Q_Kc1Fy6TGxCO!#nGe?3Y(R`?z0JwE1g38{Xu zcJuZ)UZNFj&s>6L<6R4=_)v9wf^@DC6e3tt@-)gz_7IDanv=;Q8Ux6sJw_Mo`f!&@} zI4F9ZVR#Tq=-MLB+#MNOk7$Zx5 zn)GBU+DQof`W9wk+J)!t9!)8AsKrl3>cR-LAW~dOyh&wmbJd#bP$fZR)`Z1H-LVr( zA$)%-GbnUsjyg(H$LfnTly=ew{up{=QX9LfFn`VW1G{@4XDiYykm!VcI>T=_g4hX3 zK=y$`rptHsTjc!2p2kX}*`X6^&K_SGMnX>-Qy5}(+OQ$ibaX+86oq1(n=oT%Zv0lI zhVml*@oqAlHx_52E27MLE31gFn8fT(S059;B3ti&5V>O;DB8L-YOBllToyCvR=uyG zU%jN2Z6W?gqL|e$kK27Opf>QG?@;Yir?Hjg2mb$#+k+?f8;dZiV@#0uLIKg9_MrqP*SymKyhXqp_u0hYqPdJHJe?~6RO!4vXMT|=f z_E;T8H}XgdO{ip+T;7<%h38K@|D}fSUF>j>#cVZL%m?sUq>?PK8julAxBd z$RepBj`x}Q;F)J^P7s(fa6ya;0z{FbO>ioZ(R8?j`LrZ{yhRMLg0;#<=)4kfUH);pnM zS)?W{x1`DHOQUt)1y(b*=qqn%6K|xu<kKAG`-0)V%eHo zPGM+TT8y_obbI)Iv3Hw&Df-u@dc`Z??NrsKG~fB@^_cGN z)`|KjvY^l9PplocBj?tXadOC#!+50Mq5JeCJ6we}i253}tJ4&{0K2?n#!K)1eD1N{ z3O@>i5fSlni#nD2#V@IfUon@GiS2mTT#%w~{DACKz4nOph;ZFj7mrn z2Nz-f1g51!pUd-uL$vwP-x5WgXP<}BNTGz_Ye_m4rS5L96Q54qS&D$#5^dnhTLg~{ zX8jIX#ZOX4TdS2LGqrf$i&9cEYuZJV(H^WlyjMWRi>lYU&8o?)zr(=UznWZ>qGB7b zb!*nY`HjuIg35QPce-x9tv?Ds=s8*FO&?!6vThpMX%b7p#UP9ucPA>f#1sUIvI4~+ z${SXCKKRN|DMp>Q6{?X_gms>wn%(cY?E%8eL3S9fCFcEZ&>({Exl==RbX7WjN3$44 z+RMTwT}F5us&Mwy_ZQI%ByDzOOIjoTn89BTDwJHogGZ?vAyY@gVY zj^E;}NYBl%Wh_eaGdAiIwdT^8YN6DH+g>{)%hL`Jt4x^Fpj*i5RHq)0@2)u&2`y@2 zv9F2bx<+}J3T}9#a_=;L9(~VfUEY=~6o1;Hm^VoY(N*Hc<}I_SXS=#6`zm}CHEO=H zWPKx;I<(9*4^HihH7SmA|Ji?X`>bbo;RcBe-S5%`89R&SXhTO!tOF|cLEVa!^4bSy zmKRu>)vPR5^s#?Z>g}8`M&=wNZ)dY?sfj_o)*tAl%x}RWiAq=-0GW_0Q=5shw@ zT&kzkn~mb%c$dC*dSqb}b*!4U%FZPc@0e?(hL5B?3AF%1uzaPt5*@pm|7)*GOk3yv zYXX-mv&-y$%eohuVytyZa0PCmdyJx$Wl2Q(BJyvf77Q#{RZ-~)H}EL18s_X&yN(56 z;-TUHa6C#QGpal9phOuSQEW`PkPEH7pL+P7QLwbotL(GrP~Dh_txoti>rg&c^I7-E zPFfe#9Yu~X^8;*ntTa>E)wd^UfJygu9F*@WqWZkCoN^U?xDWTEsW?kXm>J;r ziDS~kYjta`ij3bnOu8#_wMcd`Yq&5f&uD_pI zB#lY?*|mzbmWHlNq8Yj1PYHGw2mIIKmPIg^U~j&wyd)Z2Kc2Ysw)ipWDk<*1TA zaw8#xajDT6H-r;3He)@?1o0%%PcxtL`a{9=g7h^0dK&pRw%&iBpp#jMR5|@7bda+| zz=Nj8sLO?leF)5w{u3#8R=7P_As5v@#$GTNQV_eQ(wOR!muoD3^HCvdBcXwCPF2Kh zdpkW7nje&MC!>jHja}IE4YAE^SJ`jiR9H4t%CRwms{3(1L~)JmO(u{b14nKjya^i9 z4%(v)*7{CV9k(*(vJmjFMjXXLv_%$RE9q7JUZO5B%~;NH@K}w#c0!VRSb-g#Q{i9& zO1^cT|Gzy`$Akhq*6UK6#NP0mqa7vHn&@0gepX$nLvk@j#-88HN(3xl-0(%Es>Sj- z@*If8JXL=meZOkO&Zuv|N6ISK%@2ZnP9!CdLMrCnWJTN0SRHPunlkkUdW-B|3~o_@ z0_pAC_;{@A4|}ug2OYy+&VCo2u$ZUW_w33J^9vlp3+=eWYDC!7e7m<4PyS7k0HM4u z-F&5`2laPJF>TUWdj?v%&$GmKmRtDr<(R3i(mw5c6l0)@55ndA%L zXfLes4N*6o2<~|YS^KvmcdX$KP!@^tBlVe2MBaC5rrOP7_c0Uv%LYjWjM^0gnyy=> ztxAYTUz`Z{r}Y|&^%GAC^OShFB4*{!KCo;hLTMXb>;#xeA|Y5+s}Q8iDrb*as-{5{ z6|o|{y}hu{ke2c5+a#4~=S!2ZYx`;C0k?w7(e?HO%BU~N=LL@4TzM4GQ$L#pgz|YA z#V5SpXqaf*q`FkXEek57+7v;#@Ky$Wga)jNm5WCBonzZ8fxI+9^esA!MbW`=LPQQlpS5H@wsvz3jJK0wZtL~DO-|-xYjMJ+l zsc<7exVCAUEi<~2PYMsx4IMvZ4_g{MFs6l~kJOD^HS{BwoH`li{DiXW9U6pF<&TNs zf8Oz-lwOtMp(&Aid4=8-?n9d=5GOcBb@FF4L!dE{x$pfzW$d4K!47%wRD|r0`T~gA zAsJa1T71Cra##$_+#BLCp)iV(n3CZb2^`*x47K>=!8I+EfKxC|1jxVneS8gqC?B6M zoM5t~L`Z}#?%W5EkqHo3Jo3s^bYs3{O^xsjhelecOFTY!O~kU+LgSS5sPWej!Zw#v z>ai!6W?A7oRh9H@LEF0uC2v;5$|>?S`MShrnTek|(vn6km~ME|tXnMRMnAivO(50n z))m6UA);U8;V8zWpGn0ilaL+-pDS}D9NFZ~H5hE~n{UTglN$5hq(0e{_~9px1THG? zg;x6+z9=?@8x(yGqQ7CodLYqx*UOB((=ScX3I$gah#iqLp;>??m-WtvdCNZ}cB*Qt zdE>`4<=5e6`_L?9Abb2O#%05>c;_yD>9=-47SA6-KSxI(BMj>g8_A1@yY4}4a>8nI zNn-Z2=nQpr?st58bKeEpl;D^(Gd>LKB}5X^&J=OQWAu&$NllA0&8){^5`2kMH83;% z`bVSio9YK0=Of+KYhP=OSmZ~OBcAEyE1=`ktY@F;LV^bIS>joUThz$*@f=O$9pnVK z9cjtVmm8y0SQqN1=M3g(+?A2lckgleZ-rav{eiJOVaSt)<`*d#RbpkGCu>}At*8go zY~rYL*R0%a-OTnIb+NV8;d+tYjzT}yyl&JooXZ3xM2K~sM~xxB1f#|r;XhX3D5VXf z%>ZI#lYM#GPR@J|IpX)t5hApZ zCe>W2dhw!4>xkJTJZ&hP=}x_lQFm^B)fBeqsW0pf=J{YH1N=D+9n zM9&+hP0Du0(<>O)sNdh;QTnGxkX66gs)Ymtf5FtSZql)!& zF@{2(W$(~YwXgo12-|S`pQ~)MhHu>pU)TKygJ~AYA$P8i94efV|-xk)e3wQf${ve0?&*!W8;V(Rm^y3r-0{zmg?_o7qw zsfxWWOSYLyyIjX}*Gsb6mo+)A2ENT|UaehqBq%z8kk`tXd36s5TKXikA{A^wCd^Vi!9!WzlvgJN#T1AH$kr(UvwPG~%){ zB@keuB+8O86)7>uKOCXi_K*IPbo>7OKC)?vbD9xq=$g89oKS6fY9|&Ye5>(+UGAQoIcb?}Ybo6&}5ms;8oni#!iT3LDI`T+vT``Nn7f z5eAXhJaAKw59zmq$vnO{j65KcMwP@U*ZlfDgPj0KNaWh1H zP3!XuA-dzFKPX8}dc%9TH#Zq@=6uCmx7BMwGf^oWZK#m9){vC zJQXHZkSd2Y=TJRjBo;+}%GCNUTcal_A~MzLtF|B#-gh-CTY|E3+^)_ro6385x@qCw zYHM7b(Wk(g6&9>(>#|xN>d$^z;8IQHq{DORdjF;jE;Jrm`O`*2vPbAeljduxl5!sK zj(P%oJ;QrB0ADrWM6Tc~;{q@}6%Jd19|UBX{h*KfZRN=yZEr%a%uPY6S+5&4dYdDH z{~gG%yy@)A)dp%`X|0d8x}o%)UY;JCjlZg#TTFeiA&En@Qu1-!T0cn)Yy6(h(&KNRv5 zAqe5;Nh^}%er&qok&A?YLBb(OVttCbE&>0xDywX1W&#jqOh1fo42U%S0kYImFrgb( z@G;3&*Rd*c5zH+6v;O?w_~;ZBa9T;j;a({VlKCr=3rT2jq|Lq81jR%%2;z%9AP)as ziz!QtTui>DKE3{|bQ;*d<7{p?+kw5E0COo=q$m%LuKVXfe&9!oA`70^Nocj?s_yNo!WTU0v2 zJ3nAA8uv|oQ>=W=iDa%-NVmm3UC#BwKD5Tc+|)(Tcz#Q(Z%Sjr=yrHRUD1leVET(_ z%mt?->@(oV3{Vc)&M+rd$HPJI2X!870%i-H;m(WQ(Kvmw*CFWRIs@z3N>)j~Ju7k8 zf#apZ<0W=ojokl%4yqxvcWxjE*$#2@@}wVGyvYXaZKQSn?8>Zj}0P9IByT`+)&876e>(Y zJ1v8!4b;w!Sy}H;qje70b8q|Y^r|~`?mgNHdAyo$m;GU|YP^wIudq=TSl4!o%*MG% zYKurlT7jeZq&MA7{fE$wxc zoAaRf;lvi>h6c_JUX;o=hVhke=<(L_jq&lV-fP7{*cb>c9TAj{_nGi&6nKz#00oD} z(QPSK!CE?-uXKQtSO6e|^6{Y-D%{Cc;5cwn!mXN4wwR!bPrG#-#0n^~nAnpOLMYvX z33_ne!sOi!Sg<-jk5uR!_I2*dSH1=n?ruO7I#ok`_y+-kr`lJ&tOWMEcRDTh@VM2u zubL1A-dnLhrnM&y-zWlR!!n2b2) ze?xWf#Bq-fAaPvlnjPC&N9)?n;lHaeQ+?jWfsU|+FAs@rLMxfUwp1tvf_~@yhB*_Qot=EN00mY3RG!bQ8<=@%x6% z3UAS#r5m_h3(@FsCpT6BD6jEcE64kxCZCs2=)tLf3s^Ue+y7^<9Y3JezV_xEzfLg4fQHg@r! zt(zV=W?%W9e-8U5Pt+KEdKl~h=GE^E`Yk17`T*;q6R)u{pw#|s_&_yk8OFyVWK=hF z$LOo0&T;9B@`L;rW%>){6wMTh!jBwL_XHe(DaV#v&=EV%Rt4+j3!nw8mtDpI{gn3h z5U=%bqh%hjW-=`j`4wV7htseg<=phOq&FUWZD6CkZR-)xm?g*@=x?+3eFdHDgOErw z;m$caaWL+*P39UW*F5ti3@cFHyjY(v=JoJq4P0ru{&tE}8I+a^yRzDym7F-`Gux}UTqU{N$PSn75KQPSTY%_on;XHwg z!h1g(oVoKwmTMnp`e9J_~DkSpZ9{XjbWsnhJXxquJ^67O)CgGMp$)~8cbEEpB z6a-Xp8gPX3dA^GzZET#5U9ERJT_9{=N@qQQt$Zt~0uGzzypRCN@-HH9_i*c?Hg$Dr zIUai$I1X+$-#6MCg8Hyjq|}?bcGdzDV%yy~3j(qjyoF&s>}=?n))5xGbcx`h$&Hq~ z=AqdSV08?q2~z8PhwB36C$I|uwqd|Drr1UoQ5Y(tTGCIhL02J{vHu_uy<8THU5U`e15~h_&-jc_qY7Kl zL@uCwW;c?kY@4aUjM(Sm9;;2qRg+s_7Uto?kP4d{97hkdwAjt)U+#~a99~-nGc;F< zSJr>N>lUiD5PVn-4y~_=w5YCv_U`GhJh1;+hl@><9(?wz4=0_Q zF%KG#DVTOR_eMDh;j&Ag?FzpI^u+Ggx1BnHLdXWud*T?-pUFb4tDCyx>@f1N>%eBv z8-$j(4ESJgD6qGZj~zg6K9jsSS~?5a1M^7_!g@Y((2~Zas@oZ3*kbHmCY{0EAYUO5 z@h65o%6l5Qd*$Yt?`m0=$xS7R0PJV+8GsU@dt_z6+9G20P0By97@3y5u%<5JG>Jc) zy9`0W@&l& z3*{1<10ou%L7wOx*pPLTW_jh%d=l+HH#15^v`bs=OZ0u8o-A8`PMYLz${3!yxW73@ zSqV-+69I)d0MZ&55nTt-6p;F5XqFhJW3t;^_tNyUX@7$|X|r!H{;4nJ9@EGO<;|-m zF*pkxlvDl8+56M89@~2|9wV2_C31iLD4N!aV$WQB`9dudBzt7?Xz7OOI~PINW!>p@)qQ?gEY8D2|$!Z;-d|KsfV72NenMbaC2~@ z$NqyCrwppNBKI`lidSfBIo90D<$yIvAR~5Ra-UN2$ZUH!3OygrV6s-Z7`P<8hq=gpYcz2-p=mzRqyA>ey0kR+c5kUSANYcG~Y~T+>IYr4;#EOvBPkm<* z@OF_XOQAB;i@l6lTExR-dZ?~RfLrK>(N8q*glR5Ww#iq|PwafjpFBp3l#iWOM{+mH z!@p5ZU=Lybi5VXmY1N?6lpW`et#+w%dqK_?3s(~zEnd6@+vMB5ky5|(;wf)m1 ze+O|-*2f0|7i~M;(lFh^fx)Q%FHBO|A?0VR}niWIdRLvy=WyXA7x8>hV zucb0v=Oy5rVT%cL{;q_tOwoWyjg<58f$dW1!rO>Li2dnp9NSL4c(nW7-Dj&^zq#n~ zobK49YmcP=lCgeh+)YOFCb|2LFWZSbEH*O1(2w(%mc@EC6b+@5`^5r0`tVx{RR1`J zb0UY|D(e2PaxlazO8LSMIiL3|%s9;}pLcx7N#Y~^?EA~g*osn_q7IQx%UD83wd?P| zSI)cLzt+MCQ$vPH_|A^bzIBYXSX$M|d56R8E*=~F19XHbH_-o! z6NnM-g1b=J>#ss^F{#RNKRzMDWge}#kwSfSg=oVRU0}x{9y3Fb!TA+F8?R{DX5G~4 z!BcG6hO3v^Cxe*-p#E;<_vO~I*$7@ZN~l=Be4g2K2(;@Mp1fX>Ca*@vqg0!^i?vo zlyxOy?cOf5P9@fDFo9}Tv~hfklZ)jc%s%(9i3_E-WNKNJONp9ZqP`Bie4c{EAmS8i zF)fJv#6XvQea~3yZ!yVH=Lx-^1xT7}D#MD5cvFRq8@?f#GxCX?X@Yqv-ZD5Ro66ok z%>FEXyKVL+^0BO^)YtR(X9wZ+6!qn$n6rajM{WBCO#kn?_|NjF`V35e+C<*8ASz|U z7PfbSHvC@4`{CQc`{JoQVEu!MZQ) z>xSL<2yk#sAPH0+86$yFU5;#E&lOvZ!z|a5$U)m>S(HmhUD$XvCTuQjkJKqY3d8il ziD4?p|3O_zM!if64@%UkDG9^$`Rm+|!5sAUsXUWT@92%2c^D=FC!}2zW}Zzq8uR;y zI$OQXWM1Ai)b!kA=zW*j=Bt0jA0j0G^>c_Qm=H-NKxpBPVxVk%6I%odFG*JnMnJ;) z`}t?%wDYEcV3Yh(_co%z=as|rUTRKF{KhW7+7AQ-CW5T3P7R&P?K3gYepj|s8KT11 zTdI^D%abuS6DGgNQ3BRYaTrj;Y65dRmj7L5!$&;fMCOu^#&j8p+*Vh~P5!Sq4^;Y} z{6`L1__@My@}8W}7hFfczRzQ=@CZR#1&su9JVWp@Q36EKzl6OfpcnMr!bX)eK8r_x zsAgXGM&AviHJ00T&4v4eRyj6A*WsPxkAj0Q&1|^xMb9_Nf0&vz_0?rvSfF}PCUw?L zH?vOq2o^YGgTmEDDp9*cV>eWdk@75DWHdf6syU`Q0(CRqJ)!_;ApnOA{g zQ@zgFVQlq)_s6}^?y1e)7}7|*!EqigzN)}!kMfDi;Xdr&!XccKoIUL)FRtR*w_{xX z|5G!JEMT+Lj3eQ{Xg4^|6 zoj9nz2sAZksy=E0MT>O0i_XB~oi4}>xPq(#-@Fw^*5{|zScV~=nVA{q<2~g0A(%na z1oE^dV4b~k=rla_G18dl&1^1)%(`uV%xDYPwz~np^nrS1b85kQr((I_xMA$~dkqo2 zbI?CUCK=)B*J+H22K1%-nCU8i1OYG=JuQjOTVe~?kvIMQ`fhd{3_asBO~8<|{RJfD zhah)8!er6~XwEKq|{>TMxUt8jB$MH>jF#>0MB*I#*rpJ3PX8w7G zXU!7utz!#()cuqf88o~O$_?c{bAk1zz|e3@OZwc?2e^98%eKu*Rc`2xiQd<%MzeRa zWddb@3tsoP#EUbu{I%bZ;3GvJ;6>8}#NACeg;mkX6ytV!s@x6THvSteH8Fcn2mOLz{+sXG@Vg zCmZEWxPTdKQfUzmJ9?u63IX}sJeqImqGZmufTq9=XMI<0J>CX}qt4_=dQ1b{dE?bX z!2nR3X%RPi3N=hAHQN693FjN<0VD_|pagVz*v!ayz4#<-o8hJB8-|T`pew)}T7#1L z79i<8F88bR8$aX=d1aXRe>&~Byy)QAT?g7gSK;Oz;34$5{eYk&{;MnW6_G4T1w2GhG|JtN$*SVN$V|8<=WlA@?bz7#dve-d#fIg zwl`3%8E;Eu*WW%p1KBMM(tWxe%pqL0`0{8mR`@FroX!R=F`N2m%N(Zyg-Oh1yjbhm zp1|H|N8|2z8)c5EZ?J5#j5wbQsA`8D#A0`Fj*A(_?$NknW^0*x^{Ko8Zc^Etx2~ya zYb#O~TP6*x>H=OWRGb5&{Y|#PvB1CZpQ*Rjzg#|Qr0=~hz73+!1`nSz@=t)Iyqgt> z&DlNVeqZi`$~cY1Vnrd{UUNJMk(F+2F@QSxZH==kF4e9H|ok zL|>bI(YAM89JBx~al-(7GR}U}2-~oFPnd6knOwtUX~f>CZeU(-6Rw;S$;M62^(SkF zOsL`8OW%d?4HCPBY!f2}^Bq8d2VKDa$hh+G#&L#j1-DI~Q5<^yA? zrgD8dqqkBJ`O5_2u7DOll{!2)z+bd0US-R}Fj(C3+ASPI%AlQIx^@s82l9&{xr+og z7Ipm)*IzUMV6>Kj^%mlUHpy*m+QaaGfM7b?Jp| zH}R6`6hz z2IOFF5%t-`F}*Av8nWGg@-L6`agMqzya1FeXUhjQJD0=S@}LK%2L`tJ7?~c&3)v8& zdGEQY5uo*hy1-7iowt=mXlcoA@roe3zz*uiRCHY$^77G>tXNaZDa7Q%oC8eEZkG9h z;n>crWd^MyR3bkmZ7$gV!vYLcwfWx7gPtr0FuJppWsjHp+I=C3vFwfW0x3L(E%1-7 z&;En)20d-*Ut|sf&%f~9=A*IE$kn8>`XUc~;4^0l!4-4Rh+3C`CFY=+>Jh0yGEWvG zRT$1f_x1R~+x-OQ!5u~f8I1@%EKm|6ACg&ry43`E+eYP@5XU0<-Nm7u4J8L^*^^Rj z=%5yC`HXh(fu67l*AyG@Rt=MC*-Vt%mOZIHof0#}qVrz|7MFq7BV#|Ht&jq(VGdQj zJ2;VNJ|>{-Khl3YCp+NnQAT#^5o)0w20RK3K@X9_o{moX#+y_GzVZ{V4JCTSvSOa1 zyxWGbQ!d2m5sN~OL6ucB!$&P?%+od@uJ4y8^}*Q1VK{^7pN+e`9Bfv=sQ3dzpvDy_ zFk@{&>pwli8M4k;Cd#eKi~-rvd~@IR>pvW6OSxwQ=YXuJdEA(DVMIzdDm%*H;`F=r z3}+@ufjng(4FeWJlWwtTFMV?h?AXG0fNt`Ti#IQ~G{%qb z3oF$H@vV_r2BNe?ofAax8PWKUA1N+fxk38^>|9#k={kpy&dcymDf$#|Nj z$Ib5t@Rp@>)h4Hw{S4zd(=n15c*oL9rkQbsI(<`lAf{9{2Nm*S(HnJMD%a|(z1Y&% z%5}h{l^7g!R&f5{HLdpKrl?s`K~#Yg=dbaXuw1!uu=gn04Fhq4IU~H&wr}V2z&@L|{J$dHMYb3oJ~3BHL;_GM)j6f3wSZX&VvL$jv(EtJ_^1WgoQH7B{kw9k zCMIH$Tuk{SJ`Vy;jpp`D9Lw8wzoP6*gN3F(aXO|oVl<{jjNn3-NTJImV6fU7u(tV- z_hVZDqwOL?=(upu@nF$4vrOuvZd$D!4~lE66x|z6Tho3fI^B9B16Y$_5A@35!)5Lb zQAlC~2i#}#hb0y(M6bqW(P=P?0_DXspH6?3{Ci*5WG6*nOY!0}F2Sd$v$Ho>%4HSW zP5Z-XmNXj>a_1=^M?T!+nqJ8;UF{k^cJzQ4@~nN7Q5dCOzq0V%^zuY34A^5>L4aNB zYo|~+Um5nDqfrD~OcX-y5`iQm{Sp;26lq{5w`+F3m(jL}Zo028{n@xNDET@K@td^i z^|N7@1du)dy&)<-#r5T5?xd!Es7?d6*Idg6xI_De4tbXw_2tDbyEupjCAr>j8H%p3 znG#D48AaAJ7oUlwBMkcC$ERD90NT+(B1z$aXGxy6AEEOP2jz^!lA@1* zai;s__FQ})QatKK{w>XZvbW*Ql%gA(y6knF%f1y!X$IOlN)k8)_4MtMoW*eU!MBe4 ziBtCqhm)6;XuoGVt-}V^^rn%)7qQ0K6!1%6Hc`C=?u38xF`3F;xu45`x%Omi3|t`J zZ#6538A?du%LtULs4onALsF}5uk`nVGaB;GmU&yxsdd3+L&y|Dn`)5n$J8&FaQNOj zVs$$)sOFvaa_E(q3iYD5EeBJB?4s*pTUl;fQx4_(8y+S)^m+N{Tv*xj74pP|IrzL0LwnQTIgzFxE&H(aK+@h=_5mc^BIZC?#LB}LbTNr` z9-0tw1|Gb_u@MK-i%4A+ww1hqJrcRLykQa5Oaac1XOG<9)O##4nj@o>{VD~G9tCsU zFbVG3cmC7=4*N16cuD=^8y}LuzdAt%sRS3q8!&IPd7)HC5p|d*j<(r3#tN=rs6P8GRS_Q&$D1 zEsJd*%E&UfWSsX>RbUoCjUm+E95W_@7KP7n?fB{;?dw$U8<~nF$XM^e7lOjRWvAl@ z=NHgnn=ns;`c; z7$p8{e6x?$5xkjn6}rFGaDE^^s6H&B&)45OzrAr!EahmKUFt!6%Z64_B? z*X&{G^o@||MXNJn;2)cd!J9JI-u{l~Kq>ZvW`1ZA+xu;U`+T=!arx@)vE-G;x4`;i zR0i zQ9m0Crep&G0f0h=eIB+<5JbWad<4aJe!hgLg~ADg*O7~31o((IZv>J5>Bug8x=I#v zKP!jW>axf_aTt*i9V3&~kvsliazm1i-_kGH+E^#Z#_jvFAp@$?WO z@!RL@{qFPEc|P;s)bp%$_kFGF&U8qjZ&X9^%AqKzzPJo-Mgm*bM@mwS5CWh=HcuEq zzS?J}LY)*j6fTa6axaO6p>wP{e{`~BRM-W=7hg3+{)bB|O+)0PGO&DA%70CaxLrt# z7y~4Fe-Dhvzt_XZTCxh1_iP|-^0QBPyTG4sNtdaEkvT33_v+N{TAC zInKYW1hik8x4+eX6eCHDUJ;53TFOz)sEP*95tb@bYE+yVFLoQS-d(-6v!?q0jBu## z_f`dWo5k?0mIEAKjA;gJW4BFA?!Ugxx*g*nlL81%xKKep3(R8FI%@mLj0Ir33i7iv zFh#YH52*pQ>2ueauQVt)8h^WtgPDR%N>F9lf1&LX_*NUXFqAc4MPGsQ()azJTd zMc6!DaI9+lLu7OZ#or|n7_=12_+t3xC?$=j4d?r*g^PB7LUr%@TetcPkDx39sY+QP0JB&aZk;*Hc;Y(9^7b%+_*mL7EvY?9~Gv zjsKwn`Zx2Ov?o2u6?NW!Tc6x${^GLy>`#4C5=hcVL2`_=-sn73Ntw3y+lR6{VE44} zq)JTzH)k@6QV*bW(|2F}y#S=BZDalaSlkn%M{!F5wfmpSdLU@~o1zo`5WWSVd#Xyq zGNlit97b?3I&@`H1Rm92q3&t|Pyn_N)E@t(YF4;nJmlV)fZHlgJ8;b-;6L~-J;A7o z%``zUBG!&{j~#J%gXH`*JE&a)EF)^y)5J(*W64QSZ@qnskOxCt?nZ%m4EaH#_9%YK zbcO-pcv&8(R4Esr_v(JCP}rChXwQbK{-9oVGaEI)QS`W+PZ8`q2L>2LBgXVKP1_$? z;|^%V{)N|Z!Yp`;T2u%64uXM>0lihuu)}Wv=4r%6?^t%~Iq3}ghjdvwR5eL$GmSzE z4Bs&aAV$=|W76yHoFYL>E;@0@6Tr-Kh@vnA&B?!HHtkJPE|g& z$$0pan6G!++l^&dzPVGOuwdvifYa?!fYzVQlYa7F(nUp}qEB9@zeO;Dem`{#|5f!y ztI!EHYz1a(AOKIK_x;{~SSY1$rJ*E*b8Fx_LJS`Vbln1g{O72Gdw%c)FgMAM6#@qo zN$4Jv^*52B9X$*js~`c~;{P4iED#wN@ek*rT{;Y4AUentx}Wp`cFQV2eHa*kijMx{ zp&4RQP^z~{57Q*t)8}MS%w-?opxL_!5DpZzSItFEE-YM`xurDibmp@8Vn5e($VDf}Le~L{As3ONaU??b9 zRYH&npG@8#mon4$|MJ4QJTHBd%R~u5_4tZ{^26(NWeZhXzdzyh_LD!($Vvz0Gy$Yl zN@@rsf<2&FH%bqC{vI%dKfnWBEF93+;sksjp=RzsP^QwEn1pZRH?VO%RsZ48=3JOg z3{eJJ;c*gK96^mIN*F-@jv?J3);|Tb+Ra*Msn- z#!fJcZ>fLp@OB0(YTLdw+ysEa*@6e3ofJJ`{A@i=?1UYFW!nyga=}$aPZr)Ylxf*y-s}h6bau?K;sLtk#VZos#S`1 ziQp$_(W;!ozJPFT+zAdU`g3+ct`y)$CU2l7_TanIjss}o3Lwb?EjLh*)LwYM#_uDS z=rQwpkah4<>aWaQOK2{K{?Z0isx?0dhB(Pa_uCLXc~A5|IRDGXQ2j(47>>YXj7IAXI~m19C%L zj1DDCvB<23@M!P^I916&78UW}=AJoI<1MjvV!!pq_`NU1QTlqDVPLB15)eElB2QL= zku~NKne2(`>uG`}fDqJWd?}3r2XQaqI-<4{Ftz?m?u;R9de!Nr1$y=$M*vXNuzxwQ zQR>&IEE&88`SSp|xvDK_RXqb8;>=E<#q2kKBmu%pfImmEeWT1G;7j!O|7TdmjcIID z8bS&hj(}Y6zvG{Lu=*s=IXvzk_w~n8{{P~=w00!zn4+wm0XhP4XvFj|W~~O;&yE{^ zrlSET@^{Be)lltkur|)sCfPDw;73~aUjWvi_z)%LNOau5< z4rmr!G5N}(dN6-`(}0w?5b-A{ugBiz1X4f1faDv=50uVd42a_49|#f334_SOTPgi1Z%ZE6U0C2OW37r-{1(NPG-LktUR(5WbF38UOI6qlYuwUwUVE?d;4O<&i*(N-HAjV^WX_i`3A6SL8&MdcIxtTNPvI zQ2mTvSN@H*kIw9RRhy=sxwbt=H%i3RbI;SS@|h!e>0`RoPvWSO$J-JKX4ug^7zkiV zfmR?N0>V=wc^xJA9gS*bGgUxDe*rkuX2HnR^?Bdl-T>`>^_mGiIQ+hkO5&&glV@2y z#u9Za7Qj3trONTFwQ~Hu6jblUeHILV-9|-4zJD~ZgyuupJ@!A97CE>+C{q3A{QKjc z@5O%^qT;Qk*CwRkP{xO{sP6w-Au!AT0B#?gQTX$fEH7TKQYfw6v(%$!bSU!*)VgnT z5zy(E>JnZ#xo;S<&fE`BcdxXYq_M|u1F_lGLWEgoD0H^iG6H*jlSbxvf~9Bw{ULlS zm<5DJEU*nTGL)@G{YRC+^{EGvI)JCL;|@^=+~Q-G4M0a~9A2Lav>SVPXh-+CviUyh z#7APM(rduVtn|MmiKxT{^~*9D#bs7Qw^h#Aqlt$)e@(Cb^c3N)15gTPQ@|^!SM$Qy zmQe5}F*&>TVs&AMOX;O`HGkd;g;YK5($O3$dm6#)C^P{<5DJ~%wgKp=bxdQ{B7jW& zedh#?K8Uw^y=f_5%vhPONmPrpUKXsnwE#9*_gCEEfQWDj;4L*P8>OA?kNFWPiP7&% zxx12W{B1JzMNk?t3IIlSr~wsA!4-gG8jK7~3R>zk2hvh7%s!CQ415j=xDnLjOwN0g z?60C-Lxe)x&u((}BSs|J*&>|%!VOG=b3PwRp1%l-vSCCyE;wPw@6^U)NbyG9UWa*{ zTgtxoY3up2`{`Pu64S`jq?3;gy(i{OkqmG5c^#PgN+0W+cHvXa;&vM8Lrf9h4PG+5 zTBldNduJ4$mUBEGfU(gyS3du1+w*9sR;yY;YnZg4qq^oerEG$8%{KW`q^WXTEaOo( zuO<&kU)(|s8bZzMhK$2B%oN5e6A>K^mDRku#%F>q8BE(-3UBrb7`}dsj*cG4E4WhQ zJGcO7{mOpNh20GQzPTB>7HXcF&=uBY4?n7|lT!~>#Ujzs=~~+vfl(q1oxkph=29Y- zBUaqcuIZ=Tm2m(V;RR#KfBz;`f6e+m!4ZoDO>D z!EaAA80!tkf=#oXBcJ+rM9nUtMCgcu0-v2dFU3xH(vm*~!gc!9+aC~FOL?77KXQAV z?CdyDpTL8aflC<&ZpM2-!#(i(sL6iJrCga)a)?rIqZu=csIf6f&M$oLmLrrX-TDs3iU!omp%1mYXNC8dxY zubc<3p>RUb81+*N(F(VcUGzQYH3VC0R*eAJ3G%*QIR#^ey{oX0&M549{7+qX2`)>RD_wQIY@tY$k z-Co09;Jn_($tja~xXp*IVX+9Gg4|dwu+_kJP7&_1)v^;PU+=AYIBdDczjgf^X=7LRnr3f91Y6V1)M>zuL0!W zoYAEgLNz=azmxYaU#*EC@ zxe+p(8=D_;NfIqG&~E*N14x7Ym+FgWU#$(ROjZ`%Iz(Gs4`&*FYR<&(e(vrTo_cko z*FKK?cx#GL3V}q@pMh!Rcc^golf+5_m;0PPvbKpDCQ!byh^f(ilqWPXBwF14DsNkx z9$g8e`9pFt2YEKA@MMEiV5+*h2}zsDeSLYHN9R9j{OG%(&B$;KJO6~=nsL9Cn|~c` z&)kj6olLrT{TA9Wgoc3YZ@%B#bG(j2N=_d6VRlx(&g- zQ943sU4P8VpC9jJmzD8e7wl+n|IABo5_WrsWt0kSaC2iUe@~>pYqzF|hj8(3TR4pf zjEhTUy5{Bg5A0N1@|e2jW@ewaS*38gHA5R(Tcr`f!SBysPV~sj8~FClcOv@)eU{wGYf99R^&`>p#D?eVEgR!;K(; zam(CV#`8ihTXD8*nRRu#N812WVwQS4clXotDOB2a=%xh;91DBGk8G$XdqCi+k68UFAWPJwB%xMfIRXKEby=SWI z_84sE>YUpkvWJVWu?43mVk zhJTpH@gt=F1%3kndX$B&8}^FD4V2J1-RQ)bfzpZtgz?^V%gF_pw3h}@HcwyIxLG6% zIb|jF(8v9rcVDBqeqqv&nzLk1#l4nR{1uJR(~41Y4dvte?FH$aZ-rEOh&<^sTE;Ie8|rmiju0Y5Uhc>i`ImkRtNb8L>YB#Cb61{{3IxB6kdp- zEq0!&NL*I5Jb1Hc&e|;2fY;22pQ6*u>9t)samSQ^OU{7~HlAq0u@sN(vRIT~HIQ(> z=S5}UB6wD)inqvoD;tBV^u>f34KA12py_&UA+-bv$C34wehhwXq->fL%WrDeKnGjk?AB`^8AB7g zvvF#FB0q*zZb&4=dq{jmIcyVM@?NLLtIBmcr~2I)ug23lE|g(7Ol?vT4^MMD2Jw(j zOIUrmAvZ~*v%5=7)XH<^?$&N$A*ie<#xfL#aKJ6Dt&M`#s1)9@1h4%T50!1$?r5W= zeOdCp-Gq#=brS1XqQN1^hLCnEnhJ-uefNED(Ex}LBB$mk{peTudJ{JSdgmKG@m-BD zFN}TO*xZ|ZXms6#7K0*a;n^-WoDhN@-f{cZewHq~zs9vh$Tg^y5mCOjUk)Ke){hiM zZp74#!!B96h}rzMqe>Tvh9Ty8RA8pnf(60rU75uGiDAUBY7upP1|n{Zecn9Uibjs> z8I|935v{~pL3pm9sCd@~H}t`ljC)DY9`q3!d$UQZL5hwyJ}f~>wu1trZM$|YB@)8e zZCLp%`YUhfCiwt+O^^c}pf=Cn`}Aa&g2`!jm=RCCNsGIvEb`M^T_A z9BX+MrqaRhVefYN3sCU51*88A!Zrnv^7bLL49pN~(h)44XCyKZTS|6EV{%+&Zi*KD zmbOYn@#heElx4pLGkMxUjr{`O>7$7$W6W(o2|nbtjs`?P!7neyHDypU#SM8iR?fyGxkI;wiql zB;;4f;RiE~Jh#`?#K_>-0fcJKgS*)+4f_DJ*HhZ=l}mw`%sN9~@uNXFwDjC4k#~3u z%Yw}geq}(%{2U^rXYLm0%}uZ2r5K7?mFtpG{8Mj?YN6DwV78eOs9)nph^$Jv=(!kD zP?d84#PnA>*8&1;&E21GuyX;rQA_+YntJYgNcN2Oi&LD+H4(*Ye z?L&5x76mka`3@g+zhEcm4I>|npV$F5bPz&6JjngUydYB&8)_$!ZmgUjAxc}xhK3fe zFd;H_1xQc{F6QKG!52AnRp=M~V!dP9nHkDCT+IZN?GCI%xW8hWvk*Mks&;{%_u^!& zMEulju^EY)apQhKFyI7!8h5meBqPS~U`rnGP!Z1wT|V^QAs^t3e{Mkm@AJ*4RNzPiAwzS+kRdpCNNpA)3pH7J9unt?a1QoV?RcWTc(cg<+K-#u z*GZAr^dL+ve(hpGo|w(?!sNZOQ2}cl*R&BQh0O}HDv-JtzHOgONE4y5PEC{k&fz}! zDx)(uB~^J+lEXsSN(QG&SG_4b_0b8%4&HmI`U{~gzdps=hdos`qKgY&Cv1nS4-~y% z#?A?jWi|3{bvEdLw=3QfbxL30CV%A|R(orob@uBJfAm`_?^kXiti6P*)+H3tp7)Dz zAx+PIX>cizo+QpJuh(ZU=AA}@%xe7YyR^@EvI|gzYZ$pqL}Xb>nKGUX5uuYCMVAaE z?dnf%+!!3%lEu~_Z1ze>yELiP#V#4`npEkDI;SWMo6u1Z3s;Xcj=JlsF@Dq3N?3HX zb6K7vE>`5V5OA_9jtgp*Q&0(FIwi4of_4{nvRy|^Tz&TUJaQ%uI2MdYP^0En@_n{d zId&`POGvv~hyuHdD%qsyi!h8u=pvdq{ZX7kI$8;#3#rTvB<8ANGzJ;NUJOp|NWd_e&5Ygy8*p3VHBAqNRi6e25&v0S$%4K2G^f z3BQMquz*-evdSq>>~q5_6N!>FuwXckl(xjgv4>Qa^^LB}*yN zjql;t=taayZxV+Z>9+}LL62DRAX|&Sc>OhM2vzxim`2&nV>heve1B2gO!mXLLhjW` zP3-QHWMhto9j&!*7#94XGF`uyZe1;uCgm=Vmhn@lU~nuA>(SjJ%3fIrB@gY3S6C;( zu_A7t-t?3?T4VnV^8Wk-U%(0TMuw7KG)%FSaQE#gfhh)@{IaN1!TejNBJJqSeXcDQ zBP}Sxbcm~_^D4ByF(&$XZ_64`{?I}Y)zmV(xKAO7k;#?#Xy?5yxH{o+w=*_jnRdbL zhc{>oN+1>Q(yqA*cZ|2RQIh4=`0oDn$Cjq{#}=;X`ud81@Ov;c(6Mg?1Wh1nqQ^+p zEYp2lvA4ZjYT z;-S_Ev>e6uyG}Ny?Pban>O?9-w9oyNn57vV$t-y@DdbX+{7~z<0mLKcCz%x$*}9Ps zT3m})coU(KW-h;}6rtXu&Hxw4oemfF$x`~xR_ajs1|u{++!a6L%;_(_=qKV&jNVdG z96adj%G=qPk}W+}@0E69va(fMgL1dqCjsk`apSeAh6w?wzsjo@tWFhTIoY3<^)c0j z*k<%ySBh-J$=2BD)oYFO_xq|ux4Gmlv!9~5fx^e2ZRXKzSjL8cr<6p_FD))JbqUB; z8!k!oBTVlg-WQ>@JEOZe7aBY_z-)4J!&;ui0o8MoM0m8ww8M)rE_f*PD&NO}zg*c9 z?F;f-8vPO%wNk{R(A~-jVi6w*EDu|bU32U;>Dp_Kj3wu(*pPtC=|F5+(YU2F?6qYm zp^HW9=Z;-8uQCBJDW`?ph48aERgtY@kz3?)ru;F8HEUFWz#QFE9-nqX z$_1J+1}Qs9q4GK)gM8Ty|0Xa|P_T>(6ZV+Y@USel@%+_gh@DIVbm+g$AbtQoE6o|%Y+@7CvGB}Z!57)m%bM)%}74)MkMn~u#Au8=DftXkqh=G~N4d!^)%9~d?K!cVKGvx+?R z?Vr_W3x9Cx%&>L-9XDh3yj&n}GO@;0Ly$_#^y6&0L%6`vR#*GPvnul+be{F|2j|*h zP1Va8tLCCjGANfzbKInwKnUsh{S^}_s2jT`azP4j7*UK}tM~rC*Na4F+iZs-HeM~H zB(K}1n(!z1CXx>bl06d-j7Aw*|Jy0OcB`j@4SiF!NBb<{4o6C6hS=pC=lfed_fu^o zChDIhPXDk9uP$b;dexF+yT1U@^b80QEuwhgN;n z_oZYmAdk*lsO~;NzT@FvcU4I}M&0S*cU)7$I#Ew_Fd(rBicsr}2Suw)ybek}3$Gv$ zyXsuxf=~UqXg1eK?kGxmnU{Q3zeajE7x7wWO`*l>WtJP0W97oo?tI>*yG8w~-O-G} zSerp&TK^gDW$qaXJ?RpmN2{{B>6`r*1hXMs9$uo9B8R!%j-%B_-do?}ghaZ?O~2(0 zsHZO7JVyI*o%B;H&6mKd(x3%Q`B*h(EjMxw%r>Ppb3e-M;WO<0y9^2J*L)pL6}8_@ z%=9=?`WR+}Tk5AL?b!Eyr+tsV>8tb{sLxF~j|t?_X{6ppuXM~fTy-b*qwGJ-=5ZX2 z?LV8D6Rf4$DZRz$B$2m+5ZmY<0||%bc&RZg91Tv*BC{J3${Zn6?e4^WGLbu|{6Xi`#sk;}(6bEij##b6}pyJbnXBDalc!R&=2aWpV!0WKnfl-h8{QIEVSNZ?n)4QB706hm79y zmf+UMjyVSyA9XK*0_)said;zls#_yWJB1CWfjBOPKaH8oN9^v`uA!QW})&lOnXMuK-nZcxWK zD0e%?V)Kv)_3&A`TbL(PND}3}w*L3yWoMRnoe|VMez(~+GePzI0|mmchV(;OXkrf^ z%Eo@eCMh;-;-tH${m+f*T&ht~QQ`CY?eUiVe)&?_+gl9vNpUO^xy8LLPL_~-_JPRh zl~b+P=4z zuwRE1+$5AJ5x9z)!fD~QR#wQPDi;$_hWP8+Re|PWg|-1Etc{(W>{qX#L5NCTaRCCp(n)cig~*1TzGeUCx{`eYOXgd69Yme*i#*)eHTga` z^*i=~5g-ukln6eH-V*}UdYaP649#WqK4=ZIO|&bwtLm$oI(jfOKFL30F=Oi~y~=du zoCN*(da%cIjf2E+RRk^CYI&b7N0mPwz@twb2l_B<_{{`H}W1)Q_y5 zzq$HVAj|owd?Yjw#PL~f&wkXGUUPMT*v+TBBz=BMu?;WWT{_?mL8ufUoCi5+ghnFfVJ_TyoG0#1 z+6xw9+bHqRLd*~X5jl4$=>udU<3J<}3VwavV;AS3y<>hVCnCAK=>qyeO93bs?zXo5 z8J@&{D=?iB*bo*;RXQcGg`leUk37tlwW5||AqS0wukodON)81=9Q!6SYtQ~%Mp#-7 zM3yJG7bOXx+e9t%{@(|?l7(Vm2krze&1Hn9odmq?-t!6~EE5%R`nPJdVee<+Z})`k zKdvhq<{ckpo(b$!AN)Wh)>4HMk>TQwTHi54{S-NLiEy$yvzf>qejxrp1W>ylIm`e1 z(sJge4M^O8^(KZN-0Ru*-9Kg@xVf^oMF9Vn$qoXOsHgx+#6NP!{)_oaL$vT@EnsH^ z@CKU(3Iy1k=;+8YB`o7#T_+Qvb_-9dP6^CrzRz#B97z0@ z9)VtH5}rD*0gQeKIs7dDTWXIU~N)2rgmY%*)+^i}lwU$ME>XTuC_>RQAo<2(-gf zt{HyNzA`nF$*yML_g3vWbL^VuRl-PZkkYk`UhT#3iaUn9&MXg!0Th9w z-Y|j<97QB4JV|^Sr~}AO$0qzt+F-zz1$+p#$1lWxdHYb%E@Vz&7t>)>WYA{IX6Jc! zNk!z#lWvA*8@9atg*B?2RWzBB4*g?g`TWiLGJ5D>c8bE+@5ZBZ6Wi2De93B4+VY-U z+gXzr+8ZO=$4AG*(Zg(I&%26gGJb|eKBP%{7F1NgW*$;EJ z_^cj`3)ShnObHImu07LRkfbwUsa2X;M*sevqIx4M&4bjCEB*2dLxtLbrHe+4gO8kw zNXKf&6QfyvA%2+&tPPPzu?WtgABy#%KF09BT_jW%r9oZV9Ky&rA!SsPIS{nyLt9s- zG(cyC$z0X%_7ms*0MIyJ;2f}Uomp)6zPHn^f1T;lWKG3-vx7r(F~2yGEWlR@w~c&o z`t#U<@gz2J%|`XX$WnRgVE29xi=Z`~x99%CQ2c?~9<|?d6^!2z<8p-=Dk@xA8f#iL zVYt_te|%Z&vXVLQID>gHY$Fy}s$Gv>4%-B+4vKWmXD%vARor*s8>=1@!N@5ns(e66 z`u$+3#q#bo{@?AQXQqQPqoY%>mM^gcVk#obE`wOA)pXC##qW|c>(QZY`$-&9t!>Fq zK3T=Hu71|1>AQ$KOEnz;Bdj+4xUk# ziai=EcDa;}$=@jKl;%4$miN9c=Cla-j)myEPF@*E#9rbdiJB%J6n!w=+vf0HoGE)C)>Z*s{=ACW-|D_>>jvZOd~6jr=-jt z=UmXnQ%XTY&~m;#e0zcKr!bc5i(G(oxpZttHQzP!?B&PNCXzI0wMccFOz^!BL;uVt zd0$L9T}PD`BeYwSW>Pxw$IO`lqNg0qbwY0=l(*`keVTjMDgo4vi3C2DUzs0G971fK z+Th|w@G(03*0$d$|HNRnCHaV}EL}i$;1uKo1XoQV(!AjTA4J!oJjnv<_bZElPm)7I zs*ZZ<{g?^0#|*ayvDOuK&2dfy{digVLiZFlLcZIMQ&N%9$Hgh&Ji~<x2XKCjXn*xuSsUn3M%WG+sr2rq|~`wmW5CuZ;u1u;tuzT1o{ zP}r;-l=Q9S@f&6v&b34aeX3qbjM9jfZCvtf&Vx)-G|n?z>;13W6Di0N!Up{C^MFkD z<<-4jR6;VzN78jGN}f|8UCy7D2^ar~*+Yy%#7UB_r>?bLuO^N*rKBaVGGRV$+zXr= z7YAFng(E!@ggr#8j?#2q4#YHld~@Lz%P%2T`Jir_-}U~8O7-txpZZO$VGWmN-bcRk z$INHT^Fh{a0f#ROxAL^?zEgpw!`uHGLHF9>(%vi?>Wb1 z4y!O#wrB8>j{Rw|FkUtjZQn;Cs>w|ipW(JRC$x-B_6Nw4Sd&9OfTbt`xuDZA*!Z9u_uwhQ2fq7SWoph zbW3cMZWptqwI{DTYD+fCiIqdYjDComxi}d)9QeeB>aea*v|73jo?n&k!bE0}PG{Q~ zduy7?wn}6(b~W6>+dt{Np7xx}N>siEtBB1tXOVe&ZyPF_(xdnC=h9XiiB zWi!a3n#j_~8`l3Z^)?D%V+EJ^BOmOa7Tj(3W-J*ysAX=ym%x;edc`vndg)MG z`oX$-@!R?6@Z4?aLx?gCiS+Gg-^mM7;aK-^K})CJhiAuj$3tCT=@hu}9gc``iOrQh zJ&vFwkh0Mhqj$-6GI{(Ax+j(xDUib#O>9a^EJ zm+z}&?LIEP@h;=yH=MlF^6+jj?&+pM)4f^8=uIANALu4J%)pXE82x5pGZGx(Ey z^m;*Nz$qWmG~+q*{n*pzu?^!m{HX?Qqw@*AuA2#T?4G6w2kws%=q4KM-gn5yn5^!a zAiZ>cc^A45^T^9hu7XJRzCs?ob;%{4phG^si^V)VO%o5mQjB-zZ+4Bfmf>vOQ?JR| zub_X4Tvur&;A2W=>hs^Os>;duR@Y)T?CnnVuBT7GyFMAu6)0|b;Pl*%^U~+I`1@}R zpHziS#cy#J4hu2_n-VabK4_Bj#>q1Di#HDvh|+U)4Nciyac z(A7vt>Bl(h9dYmOC+>c%k~!L&FsNR|*WE_n%n8Cq>43w455UR^N>cts|jTV(tTHd+#tmoPtN|oKq$ek}Wp%yQ0KsY;Z zEyOlr~#1W1(UFMiE!qFMPq3BK^Yvr?jTvP@@m8@HJJDtSa@ z@u;lG12>;vT5{LsxqeD^*lplWBzFmXF+l;uFHNuyH*je|1VXY?*|V4Q1?5~Qpa^jv z1@DRLN^W~S`ViWwNk~_imLQMDN^sRS9 zw$&=iz7OP2#9I_gF^jH7s|CB3IrS4 z`uVHlNzlO@7MYY82>KPTtS`dpJHbCT*e2DKjXY`O)#+7hd8ha=gP2mrK^bDc@m6;* zrdg1O$)SGT(HPNN7Fy5^;fTKco`?p!z1i@10gOSKm4yyqP`uTpzdNA_Ta1LnyRE+T z5VS)~O9nUx5I^!ZJEqIb7t*hb*gY$tJti`;ZoYu%I(iT#E8u3(IJ{DKYlQ!hvF)B9 zXf%1;T`u1I$ilP;yLexlVh1GUiFOM|Rh2WNM;wCls8mK-S8|t%7Jy&*<0(NIym{qR z5wzNVd?=gk!2@N1U8QalTo3n*euymhZ#&r!4PGv1Bp08V+Kh8e9Uq6FZqvzyP z85)q|$Kw}?ttM^VQEOho$ONyGqk@3bJuHf^yv79bA0#UeO^x!AxUAd>cq%OUaYFG< zNs!%|EY;9>+uI-*16Rvkj1hw4Bs3ba6rsRD5j36YY$$I z2=c&3&&ZKJXom*O%SBj`Im{st+c?3^R3DZs1Q`dW7tfg`*K90vChn(VFKBIWH z{}*iYEc3fBB(Q#BGkx^-#L2^5ckAZSJ6<2BBJsJeAMQID&5iSxFl(vK+?NyuWE)P;z*^a%X=6%9x5vee`N|W8S$zZ+|>6$ZnkaqKZqI zZ*0K8FznuGB|nxavbMx@L0NA5sMC*m+r?}q-$lgRcq!*bUmx9dY#Jj&Mc4Q~gT{j) zYJEYMs!E4?Vo+E{b&btwpdv#?uyAg$j0QELD!{NuIe-&c-WZ$%AJPO(J41J_3OYkP zB$rN7e7atpBl}%-hY16P9#}0kBG1gY%U5p~#+Pp8DP!rB@);#%@*(E^eT zVyAx=ezN#XP+t7_lelYm@?82v!puy!+;Q?uh$;Ij@@>+@RbAz#7}r(V%Nmp&7z39^ zcL6NA163QYK)*Q$Mf86t^O{qOU7McPy-IP3;iC_K|MV~PpMF8#vSd^$VN|+-EJF7m zSE07%+17ey4%B@{?M7P~4OPsy7ZXO7E@q+~#!AF?lS17oY%uvLjVunA%gk$hGD;8n zp4W?6rN>W-C!hyLI5mIt9h4UH_Lm_nBGcg7IxDNTNDE#f)5I^XUEkEYd7M7%kl_t6G8BvUB30yRW-WWUFX_LWK5^T9g4 zkE2t3QQm^(4bcS59rlsv&#vxWbhXZ<9|& zcaz=co8)guz?(PkPei0sy~={?>gqy+oD7Sg`aD1TlSSCJCH8wqUhW6pKgFj#5TjX+ z;F6#1xZ^x~fW=d^Pe6v)-KKPIiYvG0GW?Vj!>(geUYtHG%{Fl~{7S~#40t_9+{R;L z!b?XB!tL1^xw$!KJ1(3#E9X6mU5|zcN`H$D5!SfWw_l8~{aEWGT5%+phOI`0nJDWpe6lCo*HpA@ za+r(n;{I47-_N!2w1)FXfcKJ5tJo9xh_YP!?BtAnBN-##txW0GqR}C9hoZ|veXdR> z_-KB)<>1Pp2~U7YaJMb;?$W0jS{-Hbj^ip$8w08i(JHmxjJRTMY%W3lJMRKW-kw^U zyIuF@T-EKh4r#yCQJ*o6s+IVZARWNk;$5#d+oT~-;N*DN$LTJyd{;U;F6g-X^u=J- zb8=ZXzYj9IJKKPN;OLdYh$R%&R_;4+yDJ{k56T^1HBdR8?2jTR<=8rTGm~?}}&zO>EUK z-Hqx8^7PS#3-)5!1qnDEpDrde)eKH#YYWRq>k1olX3vNjn$(lZ!|GU{nY-WZaZwve zm((HK827rLh*j^A^X#`Z>xB^?Dc8bdjWo-g;@UAR+peQ-Z)47<#V0X39hA->SUpm? z($4u0@;aip?VVygN zmJd=n>J+XEjkC|J6^*Jk&zhkd)o`9|S0|R`=wg!(3MBT&Jn>c}Ojc}E{%#@)_g`u4 z|AD)*RKwX#I)T?&Z{NH`3~M?1B)%Ev|28nlJduZdqS`$XtpbG(2e@FqNe7FP+>f;# zMwRYp8!YE;B|&0N*vqc5Uw$F`MY{(EvL(PlP&3wUo{b%WaO>yKvy=(9mJ{HYGFd!Y zi-JeXb#Ua?jWow~3Vjia<^?ZWNzd!Bs)J!KhXIp@7sW?})8W^vDqkLaDYI>9W3b@d z@LML~exj?ZKq!8K&C13$@s1X0^WFcTp4kINj|`blT#!jN7zkl}KzRr3%<|%7_ z$>6c?@ZQa^)_!Q8rXC+(RwSk*kMMSFBCH+lFt-iGF=Yxn78l+~Kz(xhUoz=~Jl)5#j?7OKc$7N=D-DkhVWFXoQMX7Hikp^uaZKBSn71<>F3rwbIyLc-?G|9&Q@!xuKZFP9T|j4b;cZc zxhpHWFjTIRsP-qBtCumn(RB*REks6PO^dMXzoUcq4PAT2#-1Iz&>QXi9hQfD<5%2W z_DyhG{9!EGC%J7*bK=b2lQz-1h@^+fEB8m;?na*J&g2?e9XToHYZyWf^V`pjwo~+8{8AZc`i1IWf%gHtAn4kFr3uW(h6Jy}nzkK& zfB{e1AOw9pk1r_9rQsfELy*es(q7?;J3&|WI{d)u@sjYk&eWmu*(3IF!gj5ZAL|OH zzWV)-bxAdOZPW6VWTDlem!z>2v~l_ z6bHW2*iF3Vk6j(ND@W=cNqAR=^QW@$%}y%cnHaWYR=gwAjrRlUX5ds88iVi#CIa8@ zdPksPtunLPGixpNyNzTYxS+V_pHxHKld9LPh-5ACb}S(TMyxt7n{k#C(#t9Ajo?L&hGpEV$G9%cl3bxS zMrN2CxNIMz(+yiH)F!a{MWVDBDRXR8Vu#OzLUQyik7EpWZcG@|ngzaUoEe>0?4$AC z^S}Z_PgRpf3jE~-eRSfYYpZl^2e^536g#L(81r7=Zf`vIc=YO`sJUmd#_epG&hi$X z>JXp0o@E-R1Dk9Y{$Q7)N4uAqou$-Q`p3Ve1n%G0@ntroMeYErvgj~9XcX~$uyiRY z+wceFk_qckytd%wh{Wa1=%^?>^yh`k#$rV}6*uW;1_aEWXd@2Kp!7blPYP(d_QB^3 z(mRa3HwS)nmpb@%HdJy|b$`8YLR*jf9sgjmiru}~n0oMCF`}$Ry+L!9-SBpfqra>> zgGanxyFPOA!>T6*7yDE4wQ83m5sRNwH17uNmg)q3x9bjnS#PIhyMFt;i;cUF?qEN0 z?+{N!g6BBP?6rua2G-A@+UueA_vz5#Nz6ZfFD3B%e?3V#3ESn$dmamM*4jaeV^8&C zuCLu)65iaRdD*XY@740~Qxjox@sm$bn6Afp?h6O{G3x(A*;|H16*lg^G}6)yN(e}U z(kap)NOue=-Q6fLlyr9^-5tt+H22fB*o9nF2a#-d!9`-O>NMq)+V>RTIFF)S5F zN^Hdb?b$+LR>oGH?hWRq?Nqhh+vmd>ZK_CM6V9!!hOk>$6(^2{=q*f$`FJ*Y=A*;I z-F$+sM0!s^oR1^!12v0YXZC9kT3U~6S!wCXz{l-CHBHTA+kqzNjs_uuLH*&-VBz$_ zrOx8NQ)Y3497ri7w21A=8l5>{g@a{88xWcB@e&<(Qj>$HWq$k}7|7nBGVg`{g#`Mr zrCqbS)rGipSV>A9(YDEzgj<_}Pb|?CH2gSz#w*SOv-hcCswpfOt-3t)a5VnckQFGu zjkjHm!>%Rj%gJgP=1`Duih<(s5i}J`*9vRmWwVC3KaJMAxN6doIERrG1RT4NHWt#F??{2=Wwq~4nD0IUn}K638~R)>rA-4{$fr!v)M z>6pdZ))b*o3e;+`cPSKdis$AF_{^ zM}%PBI<@YT)5VlZ;I73YVG^_+6-T5Xfw}z_e1iVN>F5z@iB_L69ms0!SzMw=93h3Y zQYn;`gr(5!s>h*J*lp(RHBUoALvih6pR-iOFQ}qtuuDreavsTy$ z_!khWJC*rcjpI#pocWe@NuiHbun}=}=_5sb-C(+7`SrA4aCw<;OLwm!E_woro8;c} z`GkK)*=rgdE=o9SM|#-*;PIwhYxS-*r;k7k8!&HU>hjGC+B;W8H$fd=%BI&%SBQ<+ zK=`F+uVc47GB(d~gu#U;wO+Bi+_dk)#ufH<-Kbk{nQeO@N6eP`%BV8wCCP8Bue`-m z)Ua-)X!r=ot_z6>;_vZ3&@_bGnE9xwas8DI>BeOV8SLu4ehb)4?D<)+OGEc-v0Ngv zj(hVuH~%nLGpGp3r2ExYsM|wvM3%~Xcqhw}W)V~q!4yt#MtJ01`+PDNEw2nJX+wkd z;|w_)-!`YkkY_y;R#sIzim-i~p~rHyxjB7I ziL=t$)M3)aD3gXSokF|#H(X7&KDwZ!waKs>$`fsttJ!23X@>#B;`=y$#XNkA*)M}~ zf1V$W6lY2m+j>ARGLue>U0I$&V>IetN4Oa4y^?(2YP&tI`@uaPV@6Y*)39cQkNSlo z{Q0w0-H%d+Lccy)riP=SkKDZL8g(Lh7Yr!6$p0e~(IC!C+bteBdk;}P7fch#;U<#( zq3VXo43;$it0W}rSEc$WW^Dhg^-hOPW~1IwwLxb`tVuLn;oM7~l!xMXfvzAN#Qn+0 ziIy53`8HnEC#rCWU(69*IY~Ey8^8-tDV7z~w|gjX ze&Sh2vH3u9Ya+pczumaQ0X2!MnqFZ?Y)9M?%rQ{ZG^=Rx`@j0YFEy(^ecaSpb8#@8@*TJbr z0a#;;nM_cXpAKJx*d@}v(N9?lE0e{<)R^xOoZo8iV{6(yEtarhth+^UBj&ZT)@Qx$ zcP97A)y*=0(nQcVG^Bo*U72QlW|g9x$v2(x_FD{`*8lt^wXny`HBRcbF6UT5vj^+X zrKPFAXK9Ilad!W^%OO-BHMN8v-Mk%fPrsSO^V6b8?GGFmTI1)c4Q=lqoz}wL*880| zJOct~fJuqEOjl+`1_SE};5I&ch%SFOG&F>J_|2AG>%7!OcZGFe$677MnJtLZfYPdF zX7~<2S`(uzqVDlpE*_iLB!yL4nczT^`yP9us3~>z*-&a8e$0t97`|u=V6V?@#req`>8=7*+JEJ3DSzbJ44$YEWcI7ALd6L z+P956$_rh8HVNLliHkn^LAml!E1@m$0R78yRtfwdAq4NBnzT?l$O93;v#qf-t>> z`#Y0g?iDU&Wz91mTeM0dGq6o;o3z%8ckqT|+6tM&Md`PEHf5fC{yfjqc~SlLJfB?k zU;?(tiMWto*Nc_-W!;Awth~>0x&7y%E2e77zqM)N_MJ&>3pCBYPnFGph&i!IF34*T zzXH2{fblcTc`W|faBffV)Z+~?23bb2*N{hrD52TCLqwO7ca6WpeRuj-g&Qn>HFcL) z$#%<}hK19Q8}2skDN@9D-^)(aDBS1YsLoC2s!FZDwP7vKqa50ufzK)x=gG(aj1sN#By*ytnw3;CJ?F;eig zP&VkeK~6TKMO)@y<>@UYpghe?vLFhgBghCELn^^T+NU2kDLSf;CIj2L&+Ev#ykm0% ztfxEMaD%r;%#lcZ5%2JNDN%YCnPf4QoiVc;+z^`(rMA zv))N^STF$}&gv>!LAWFMBT;>F%J6~&G)YmJjo52LD!V}O$Iq-agFvY|%bWr_5-g}O zKVlJoIxqgF!6migdObPb^8OA{t~cgXrNH)CUcZBDW77=jedXSW~$I3e)H8aG(Rm?OMK zR28tDWBY+h;*4cAo+Td)LoP2Xi{P2!We}dwWs`PINH%`h(?GYH0&^`X>v^khtBh7Q8()wx237fIrpd{3AaQ}>gb5${Lp)cZ8M^fvlPKRt z?CUStyQLdz4{q;vIB6)rbBXRK@pdwt5~(H)MnnyU*bTj=_p;*O?CJ`m0M%d%U;4NuxG8EOk**K_`m;8et&*3O znmQy9iI&%DM>?Aw!y6Floc3_A{xXPL=nJOU;=3x{FB*+DanU``Qmy*s*kA!^8P(?M z+S1gUWBUA~G&};^U5|oqt$vTZS@@!eWMLW#n185f(Gb(wMH^*T(y^3bwslT6hjCI{e2I57<+H8B!bOXdy`L0-Zi02 zeKj{(j09o)2_8#ix_mNKOo^sO=ZBUyTa82yI>AF>FNX&}6p^w8Q`IBQFTZgoykfqy z^pr!TA)5F2=@rc=^bA90>qGX*XX)1AexJ6y_<$xB^$>5Jv>qEILX(z4U*<_fosdXD zemj!=OQ*WFT-<(5MLx@Lr95ut;8L28TULWn(bx9Y$jhP)uk{$y5VS2@d6DcSX+t0= zy(nxSP>mk$mfUV12C#QCa3|g&8ft|ZhDMK}Y3mGmbZW3S^njxK+UwmtXTlJ{PAZQ; z25DHlm$YH1Y#a^a3I7kwb`33s=3K#7FAWmwsv6yxn^*5q&lvMcQ5h)d(H%;6)LglUY~U;23N9eqL_X2p6!n5D9QA>n-WFS^h=y*o%y(>Z;f< zPIbUvFGMS{q{2D6OX8XULFm$lg)Kepf{pYVK3e_88Sd{Q@+pfu3apj23_LofUDqi* z?h!d0aWhm2*oe+wm|9ij1d_ahT2Q`A-yv<4s9M_2sMvY6|p5sOvAQ)}g5}uLp z(03pc;q9D(J3SoTCOP@dCsZI0&V^Mf_18v=nXChSOM$>zL0*CeN#^Yq!zk~w#XPb| z1jjW?+%2AkK=$>=dX;)JJZ8Fd&4@IWI*iRw-Q^Xl{DCdUy7)8=fVf)r=+z^6VB_9l{|5R+I@p$-wxe7hCy)lHOAR4$@d%%m)bX zAziV8)bnK&Se;bf`UcuIIaio3c&YXM--NhWvKI%BI}E8FR5m_VSt~$`E5pUVk|*`4 zjrv=l&dM^%w^%ah?b_EHAtL}We^sfYl8mTWd>@r{l1?a3Nctq+lUUiCe8m)7Vw3D` zKA;=+c8zF@s9!@`NlK76Om1;auurIb`%J?!EORzgdWzg6?> z#nNOZF(Dzp(Wv;-JybkzeI0~s_viBX>UzYy`7g91n&15QecQ!|_?PN`;tzzLiu@m3 zKj5|~b9deFkxd7hzV82$8(rs31Zj%;q)eRMcv0_}7QbbXJ7(|K%Ix2I=@GpK=nOJm zqRiSHMlBJpwXJ9)PF5OUVyIh1pu(yzHckZf0@Dq1*4~lTG|<#7$W+!B-mb3<-|xk9 z{3PG3a)E~+-!v*NAQ#Fp#sD6QthusFD5Eos@g8w;ns1IkB=EX@&8^#u>|>ZZBlP!-SiTx1ON&J!maf2uT7w)kj?$ z_-hHEMz+Y@$9vI&h|2hHJ+rS-YO$ILB#?+52||<_1(WUFM9Q`1s3Qi&25 zgEe{Z#yGBv$yNRS;Nht$xPY6Ce8lNvH>OpdBDbKqD!^V}K9JnDP`jb}1UU8FKK0xZ z4`m(f?k2z3K<@Di0zv}b>b1MEtUNX3e$>@1AIjPIEEb`8-9=o^$8jIAAL)xYFSyXk zc|d^#+t2X*Eik{M+j6IzUVw@407f_6T?hIUyr!>%A$8&ud@lc? za1|rg*b_U7Ege+3>qE!b`3w=}P&5AOz5XixmC)7;u6M~Dt*`OUQb4#JNJRLB#0Xi= zPhi)89v1ajjM#U6QvH#TvDGeRCg(!bX_es$7ro2X{+EYw?<$ zh&nr(iAj;68{m}*SC=!3t`UM59=&Col|mY%8cAI#sttc^wpGN45&Qqbk($IWi(p{- znP5`!3W+$K1^$++#UzY@7vp^=r&;YD7$LtzlKbCtyg+|DbhLZef=YCl$WUN}AP93$ zm1e8QmwFy8Pn?S#MAgi~_k2&E*q`|j$s9>3UC)mSG zGEQiDhWuSb_Pm43@q5~!$nskyo|N}6jUJ@WJaH^!>Q1R|2e*E-$(;x3xK!AbIa>Ia zuBINIb_iLK3Ch9|QWpW?2%us=wsmwYU0Bc=lA)Sd@fsUae(s1}U0YmS{3dTu{fA&= zWF(KRjiyDiz-pa;LvMhr>^9fLu$?h?m^ zwzLz~KpWvM`cX3}FxpH(v7(Dnt0`eXdDvWWk)pd!?l#{OWB8i{@q zPZ^=<4G&qSoLIpT))|?}Do?fd9foW}_6UXYOM+fBv<__xj{$$+koMIfvsS%b6m!Rt z18#p5{-~q?JWXXEaIcy5c(0J#$Bb&0p+0 zsOIv1q-kdPN)g0dU0gva_E!t62s>V{%ET@=r zrE`00xX=5=hit=ys)!=i!%fW@qmRn=kj)v_hR8S0{vP~qrX*T+9hH2U+>Luo88Yka zi!E!v(FXiBO>Z(9z8|&W8m2_12;VNGJxz!u{ zgo~2`<=FHu8S_zw+Wx-|TKu&v@9bkQg%a%(EI8~Cs- zO$+YuRdfAqBmDhtZiQ;2>{#}Gdk}Qu)v?8s*mxG~F*9Jg8CQg#ktvi8tS2*D99C@1 zy)Ktm(t*7;L}?@By7~{#^LBTo#Ox_Z;m9PW%JNvuu4#j2hBxSS5W34Jwp$pCP88_E!S7jxOMx0wN zvrWG-%IJf6hnnjLB&eP*&6kqPhfeq-BhUG7Rexr2|IiZ<%eJJLr_lsUBRq$Pdh}=- zFQvY^GoN_S(Y+f7oxwil;&g;_rIh$e@r1b7PKt15Y`@TUR~?k6%s9-lS`JOiM9+>Z zw#>jf*j64}YbwIYZJ@fx`Qt`&MWpe*p5z-YE@E)Wp-ckdy+6TVnc2xFV+=c5G%~$L zQw!aZmac7XbZa33+?4gNm-^7@!_1LEk2@Ec)6>7$>woC3hwqy=l(+x`PcECf4Wm%~ zw>8S(+IMK`F-chE0V32KLbZzt?|>bSxwD%fL?Rw<0#r zYt}rk(o_y8)qm_~{|gDy25nRPXkuggFNm6BQcz=<(}hU%GzCY1uxtRRvY1-x_CM{~>b$AxiS>>ZUgmh4}0ZtzwY#7YQCd z{C(<&_YcFSmHHp7?(Z}GqmAbQew@L=c~I32mHD;m$p>04qEaO-3FljDGiH~+_6Wwv zU@3WB0jB>AKw|x~eXaa3TYwBs-vF*XZyu5FHOOp`1Nb(be^MhsWv0{QH~v{!3D^$& z&;9++T79Dr@IYJ_cxBNx0>IAzDA@qu;ea=6*-+sB1^)uo1h^{Pa*dqna1r%5u`*bY z^Z&j>Js!VRq(gCd9U!cWJiH&HxZS)TGg^WQAfSJ4j7nr+-1n}R zFe#4071NB8cbw*bJy`%yz#c3FO^-~r5JglM+0Ci@C`<@ zcGL3B9t5+4dH!3kWS?V0dT6B8fbBwmRAv`762R~+b(5SEDGwp$x91p7qe{c0)?k@z zx#URRa;)p06>I_BbN@>V!9dID=+i?e_g>N7&X%Mq;daHX&Urh_A7y(_4Xf=<-8jvM z4eOo;|LWmJ@xhV@k|-;)5*%7y+Yb9dC0FFUjJqENSGg3V`vQ2!y!&ENtGUhYd@azE zH07c*F`&KuEAN)v=tDU2U;XKWC5}D0Dd2EDpxU_!crSQA1DZNx-cM41&KBSz8vHY< zFr9^LT^&>(pSAIv%N5Wf3lG8$=@(1emXFCL1P@xag6+o=J@h(h9Jejny7{uQf7gn{ zm{OAraQqh-fJZI2{}+t^|A!1@IOa-@^{O}<;``Iog{+D_qJ3dNRd=;YtgC5mOPQ0d z$|uGj0XUyFqiUIXg__BFSH(?1CUq56mB2XX50Zvr{vJo_OJ2^%D|S6=084AH$f{C& zV|x72dN{yl*Crm;e%HS1Ho&6izvimPx>w6>DLUI?0HYL;71mK*j);dx3jSv2D!JrbL_bC^6$(UfGi{-u*!+jX;6+bC1dpM80#}%+yrG z{5!TwZi9Ufu)aRjhy1fWNF-6c4+{reAe1cu)ik%0_hSNjP(eo#+tpu3Z+AZg>Eqmx zgZGf~NRyEMnrZA4+ozUQr)3qW?rgL;r2%<4xgD)vY>b zE35QE8TMRaR(W=Ye?s<{Dln0*fsR>(J^EdpTKUgeLpKFPni!&(JNRS6xppiNzKSrO!p(N-FB2gx-EvkK{&CZo?pz9tF`NxiJ;nm58voO%h|KZ{FmH(=jHrb#a zzr}h$%&`n34Z>mTsVn_}OGt}uPB4<|U#z1Jg~-0|h2xB1t=x?Gg5&*o^>7JL5by-& zG^3OcJ+KF37vbKy_J4ohL&S!PGpw^h!R~{F4~PeJu(Lj+6TN z*yHc#LODJ&ubT5wL|CVG(=GAt&eYpB za`@mFI#x~ZTM6fsZKU#}PQ)}*Hoy4BC&3#^LttieC>}-aWP_$Uwjp@619KC&`Fiir z%@@LXSm+toP2Y1I3758|)26%w5Y`@s*2TGL1^CLTIAa5`5+vv?V&nQf&xYRgo2~Qz z5*+|n@RxI1;3mojoKUV!v88#p_^X4~iD&_L6~19I@IT`Zeu<9_h$S*~Ia%JX*|RKZ zvlx4FYQJEf*VFcUqT3TA1eGwd zrd5+8Ngp&HW)pXW2ebf^GgI5amYBmk}8q8M{LdaZ?Y% zflBz~+c9VF2trtXRUr(Q4>gx--^B2I9MJU%9|7fvy+e!%1L5KHgcMB+Q%-*?I!QKacr<1Ml62tT?dBoYtcqSD%aPd z%Mlm?Y%vj$*{Q~vDo?H>aI$E=);FBuPvlkYe*_HyL>XEB?vw8UAEhcYhj{EG;~!y- zX$|&3PJtUSz|i5fE?9e{dg8k}7PA;r4#3JPu-WW%kPi0LX8~n<;$&Kb7ZXF2znRm zzRB7Tur$5VY)8!;Spv#=Xd`@uE6^G2C)U49z-2E#;jGs;F2J zwa*MNQyz!>^{SzXI{P<=XsJG|%gy{}4B5y5-N2V}-t!v#e~WDZoMK+5&H^klcr+q! zdj7-5_dcIzYFU}eYpcH|U?nm({P9~76v_?A88;ACj{K6EWzI%}M2K(o2LQtJcCwhw zo{H}kiE0Ic_zZMpA5sFAh&w_r84ma^kxlOUnjPimjTwWTVGP2K+V>xB?%I%{a{Rj~ z)s{j5H?2nSvx1{i3(5+LZ|~bWin6am1on0g^X75K@{Lnlx1~=@t_7X z^URM%<}wV~MDVB@Qu4uSfsQOO+&d>SdJaC$uz>mpSs9nqwS)KeWO)lqiwZSV8Or6G zb2>pL1dl#|GTEv$Ma@m?O&5Vsre%2d`5vTP{p(Z*ICs<0^)86VvXCa*9zl>ca|w>=M7Fu>3e z5BviqqQ52ibqsBON(*S;fR{IY`!Y4G_GznIe8IrAQvd`@oNpcgDi_Z5&k*Y095gF` z2SK%SUd1q{^x8IMyXTx|+f^G7 z$9$K2C3<}S_N>3{xCK8kMOg_!-P%X(4=C7fCxie_Vi*ffrRsnT7K#yAb-A|tb(UGj z3*0?SoA0u(rzW`MVM<)D;vL^sC66j}-en3y#_JP4+oQ>OkKa|9>sFJ$dKHEQwss3i z*e)L_{n>*kD$7pBm`}@t>v;I+dD7y*-_I)?zZ-r4fe!jx+NYkPaY}t1#xMNf6G~w}H%UJ# z#ft#Z4QJSq{dxf&H1(1B%Heh^c&_>8UH6>Dwf_2-KIo_EdLS~>o9MiRziU_7(PvsX zdldytq{*0BkHYRS!|!_Uc|&R|VUb50h+Q$swk zW9Qz%_+#*365l|)E_yW(p$^w2&N zE;4KxO$?ychUN3TUWIK>^AN?Uyp*bw4B{pVMSxJWO>DNw06xsr%tw?3zZY4h>QFQ5 zRW-tbL3LsCRQtaI$7>Le=oiKNN|W?Qj!kJ)U^$#%&#$j@=J1>a-mh{>hY zzBWO7_SSufh}*Q!i`!#WhueKONnm2B)jf1axHyhX@apc`HK4efEc9eQ(l|0QifN#a zs53B2T;@AlG)`MzMh(pIC+0JUdyB%fHoLI2MyCWa@xV+kEXn`T0(6q`S~W5+X)u`1 zRcUWMzD};{^}JnV24=+&UDK|hO&6%P!!Wh{mu2A=RL?ibr)3O zjvbvT{vkR?RN=nygbBlsw9@EB9F`q)(p4sMk=0WE7r5lj21zXO%78m@VyaR?VCr#t zM4Gv1_(SBTo5OVFCLY&H$m)5CXYxhtRELn)cK_9jE({`;*PeKRb>=)9qqkiVAN(;>^s~+Hkb=1G~SYcmAI++8AURV zPG0-EU4tRoMh?L@I}>kAg@uJ&HvDyr{PhP~QkVFaY;B&>ByyJKBah=W7IH08n11DT z2VU5h82u20?-Fx5wxq`WYwl>F67dr81@#L_jOpA&l*IyJpej3e?^RYD!<-d`oE4zt zK~tfBa-Wtfp(mOtJ-ZbyJ0$P)p_#gHxqExsPpXr&*W* zO74CcY+hJCR-8M3N6gIC^YLc>o~PYxL&v}4VuA#>b?SDPYuAWtvqH{85Z&LN#Q4_2 zG>q;)JrON5-dFPP)qt{Ov}B$e3CD(L1c6qtk)-)7^2<6MhSfwvZ)lTy%+IThR_{@! zGFNA3Gqur|tx&+g*qp2>jqK))D-;H58da?%Mq=hO8RC`RlvgJ)vgP?topF%?zmqPe zWcEoG;g{PW1HU~5F#Q#5;3j~dT0Cba0hC?@(toS>Uo8U#RrUt>DYrQ@Uv+=Nwhaz& zdMEdh&D-+7jezSJ(cji*oLNtG#2W^Bs94%u#9^Mp)jb{MCSn0g#Q*m~eI|b!OLt$t zTdGJnBG}yphnYmnB@Fb#Trmd_kNFb(Z7hTmbvpZ}qX}03xBpl8sfs<7#3(o98so?5 zU7c#4YLz0QuE7@!a(=C>tA_e@l1*9hUvanXuACar@X7>Bl%p+G0=n&AV;xqqMb$Wip+KpYF*E<5Bn*!DM z!Ad>l`<}+>atI@oNYk4fybG3Ncs)!v`8o3@;sQO#bG2y0-@>BqYLG^DeOhJ)Zn1YG zcXM{>Ry=n$ev^UlB}43JGp*V$of^8h+8(FpFfH2MZFl1Sv1RAu*^2P^r{b^fliKa2 z8t>^RiCO}&bv`3v+uZHn;l|M~DWnKK4w(684)u%-Kc&D#3FN)H8rdk|)i%BZExO+y zRXFD&DmFM@`{n7)SS-oC5MYE;#uPPXA^4`}RU7p-QuRv5pvy53U^J`ziXT3)RiW)y z^si<`XATp7HET6=zUY?2`TM@A^dz30on5>};34EXRdBp(k9W_n>-#q68das(pb<<| zZ|%PPaqgioqesXQGxf}pfuS)r8|qxmn>%uG7J14R$N_r9b*gNc7o0e!elgG8%}yT) z6WWWl+jJ{V<2xby+jRd{{R%dOA*24wyTgZ8@1Q^|q9Q1W#6`*N%HpU77&hWCEw^C8`wqi&{`Up^&|-7WeHw@JdS z-`s2}T#5$3e(qo7ot+L_yFo*u&42SIEOD>*JlZI;(hyF5-KWJlxp~&!zdM%ZwpK;6 zO1!PErbee#qsQoRylM}BA!7jL^@0v3vu-MzFPu3|Jm5e2{jdl#2b)7UE2+I>#J@h1(894@_0W;^Q!rPlaRx7FE{)b3S$c z+UZ%)+Fb}}AsWPOz9e*WJT7Vh+Fd#X^^abhwvmrCM;Q9jVdNMZzO?XLTW0 z2o%)%c1+c_4gG^5)5DBg(TQ4VCV?UHJ@;tL2J(QSSO415X@F zjq1^Lb1L=?vy>hYb!Ys;hoK8~-!znT>!t5I{Z&K?(P4FWJF{~EhD^;z5u)Obvs!Ik zVNf;_-HMqkREsXY#j^Hed&pu;kv7xj%PJ!@Ju!N-{_2Z41 zQHRHILfpLW$PJKm6A?qn?}J3yw0i5Tnj@;!4V@MGwN+@`699U=zp2~sZE-LBNCA7y z7)9-e-^cpfxeZ2(TxPJZUt^H0b$459e*T^i8080xpZeQ%N zRhbh>I>~EGADP~QpImI)vu$f@G@WASZ2nVobWd}!JG1$Sq-SB!vp?SXW{e;HbEAq% zaIpC-!2+M#$F6*#S=5;ertjFL8BH#_bRkP{k$UgP{-m4JqEWfhsjk#A-eL3LL^II- zE30{WNk*r~`HWw8TWa5xpWg#_z{+`I<`i1$WUl1UH12Cwb+vX@V`TJaTFV>v3$zH5 z3E8r*dx#8V;#>t$+v4AlZ6jZF<)vUejW(wEj+GF=;h$zK`)~Hp_eEllgKy@(cLB9`hPJNLB600mIZL)p;=!x5A*L9uS^Lhl_cpGMCrc|zwJW;~Q zr7vAR7&PkIEw>As!c2PbCc159^hXw;x7F#On-rM>;$Ou9qa3%NK>nVBg$3uAPEjxadQN}C8L`;eA zr9HYyTsRKP2+up>^w@K*ZSt?7q*(pi;*|vcuSn$OE+BZU5OMKrCZA{{b}`yEweQu2 zb1}QJKeT^dtq)vRL$@NwLsOEagn!hpq1E1%X{tTlyH$JTLqU^fqc&|yuUBcC4Twa9 zrP&%CqRqG}l|)u-&x^oo%{QWDZb@rP0sXvB|d%L1Iof=I(MIeew;O z@w)Y2-s~LMqKJ9$n9ZNGGT^(T z4rpCqK{dH3>-_QaEB*be-78i|s`w*=7-gHny@A?mBidSx5cH;lEB8!J$vRBCxR4Kt zkStN1>+#UxD*XNk6 zYiB1zOu2Fko2khc01guQt)^SZNh^o<>~Dl$fjvMpLBN|Bs+_7Rnhfh1Yd~TfpYveP z(ep$mm1?dPz?Z^VlEI;U_tgoI+^8uav)R4Bs9wp+acM|vKK<5lwe#Ij7tBW>cTjoi zqbxO}<#<;4&HI=|bH#akQs|Z8UdAW1yoT>Sakw@2^-Ifh`-3->jBn0vH{V@7P6_oy zXZF;64;UC*&V9VM;^frqB;g#-|(@XkN>c4DCX7Kh}U%+yt-kRCtZ?iMoaw9DSs?6k-Zbsqo0vwVMIQ0L@+ zAdCt-$ek1P>2McAT<&Vv_w#m07B5-YmJVtzt#mysTikzWcz#IwXJa7Q5lUeE(7L2| z^kqHyQE@|@&HsAE#razkHvEGQ{c6iNlR#;ot^N>=caHb)EzO=;*X8BcO@e|7vkl69 ze^iwZDNgFr+kJCBF}l=Gcj9xG56%vDf{xctv1tvb+n+bEVAQZHtbKzk&i#(9w$)Ae z+n}ZKjiS*2hrLFglYK>ne*NPk672`$NHRW9+{tIs&1b3q?UkFZsoP5C%ySi(%DS(s zey0O-+bJBPsOg0KG6&bWr%uK1{L8;_vO1foTy*(0pch6-PG)Ieo6J_o0z~|zzaOfl zN-A3LMe-UoJJ8%IM_4El>+%n2d!#dN)vW5RS&m`gD0n1;pDuLSWX2*_o*%8MlR($| za8AbNaOmpKK~7w+Y3@P6X>Dw1d0W-jx>K!~+cw>HFQzo1qzm1BJ^oR$O` z9XA@0YyW$lW3CuaVfp3>yG6-D5F+wMak7tmRd@DkvqJ`=hUSYiEdCp){vFn$;%k~a zm*7ze4X$h5{ek;BPEv)5C^9koDuMNz@^yJzxY=z?&jCSTfMYXC6l5;ul6WpaPmd@x zO5737eueH(pZnxdm)2-fXv>#CcxfUk8$-begIi6V4B>88BQZr!i$sC?jgAtvtSf3@Ot z0_^`q8o|#AT2?*uMWmoO{iZAVz`x3J&<pQtTpH>-BdT)*p z0OUcQxNFno2AoEE0pAJzQglY(g|c|w(dCs=O|(vSVkiBC>wwDzp?c|u7>n}iNBR33 zXkfy~pD9Jo$hymJRc`-Vx07Dvs}Z}8<}wus5`GUC^P4AuH=C)0yeumUQ;5xoz7BO_ z;Rq8yE7WzX_L~n9#1*1*I$q{TqWx;H9^*@A=XYBY!tkE4J=1!iv((RZyhzt^q;3g{ zzYhMDnxMu_wm3O=KX0?xCID5|Y1CEHYnAsC02OB$iNbx~#e205BAtM88F{8vx=Jo# z$vs^>-RxDo!OTXq#PqVM;A7boa8&hcd@Rz`#qEfCfja@DXdxI~ZR>|utMO=A7G|dPvuG+6G zBfoWw5@8*j9Z@2uf{ivn5+}5|#vltg1slm6n^+`*jpBf@7f+ z0%RzPZ^-*)v(9#cZ~J)a9q~!5y8-q@x9{-P;s@IY(nv;W*z3+PJ2fhmr>jS*Hfo|5 z{jOaBZ0O)Poo(R@sb}5DTb1{Wh|Com#7<|k0gC3$?YOurCYRY)heXGLRKhg0eqMk_ zsz)R+fPw;L@9D$?u@0app?xn@8B~kPmJz_#WLaU@kTAp!k!|-O*D>rA5n37&=Jl;` zU`*hN&)<>6WWBc^KOh%&3p-(jDQz}V!eb0c>hct7AHqv3vi zS_k1nulDDSEt!lw7A*+g;LwQZ7^x0hO#DiE-GltXzibjYB@03YC^k0*&`{%JB=N9_?JssnT$4{$EvOg!@4=_8l$6G{X9=)aX)EWHo3WF~T zv1|gelv|^BhYBNqVRAb)cJff>$lr7yWW}!chE)6M$mV2r-Z*kvzbRpJ9rLG=_iQq^ zb-i<8>#qT%5tChgq>w^XrNW3gnzC|Qt>*gxck;H5;Mlr~4fm227rbyuN znxsC9ANQwhY!VD$lY!Z1w3O2F^^ffp&(&m$DyAGawfnP+K6F~0yRCq9#_JvWxStPT zG9L4YCb2nsEhg^Y^&xF!-**Im#ywuezcI>QvTx0HYZ~lN0yJpvm2vvxLJ^ID) z;sCdr>)+EVzc&K!H*yPRcdLH$wa@5XLOTL-Bpg@$k3}(6 zX7xgbj#fGpC79Rlm)uXg5V{sPygHps4@40D`2H|{dfnn|wcj*I8z_ARzi_?tfap`jnGuB48+4#>@Xm=Q7-negu>6LalC2@*b}eTIPf@%tT|lO$sI(iz7o zhON_fHJg3JFupj97XPMaF*&6cd`p9aU0185=-u&h>9yiHpdSMf zt$!*A>b&H2sRYXXV>dtxwWgb;Mn76(g*{S-p!?xJv?EAw+2SqwboeFSnETPY;*C@^ z51!2l+W(F|tyDKx-w<_J%)kswFg(zE2IUu_uo{>g==+S#%1S9e{yz}@px z@9M7VA&Bz6zTK7hIg9*C~Ir-U2^U~t->omnlz zh(xnDvrFBMdfQN1B8J)VZ+ptt-2@|QabUA?4*U`Aq)61L;eK+`)QFH<#yP7+wAHh% z5h%*|*=7S6T!bbXizavRVf{{g;(T^ie-97 zZR&O$Au459ul!sq*B4J`owJX%xG+&-p=PeAF5fF5-n7h()?qm>N~?w!HhOn==I;yI zB#(N%FF^0z5Esv(=iLc_Ta>WnU$lp*^XIpg`!BXTQ`=iHzdptbtNQwa=xiWnhsSrc z(#nUOfb-Ib4NZ@K=?U0B_zc9OwCY=45s?S2PtV;MH_tV|``^x;)$oGgP!1^Uf;sr(N_sP&fprpKyHBzh2y zdMrx4&PTqSuvLg&DvLFv2Cb_ba}xOv*8DH_-uf%b_v`zn5os8@1O!I9JEbHYq?M3H zDd}z{hL-M9Ktj4fQRy0y78nqOp^-+)=fLmhb6wx(Sm66Wit*Kz zpsR~$hw4sIA_(8d<=eHO%fpwn>PywliN;~mkJ>9CRC8i~uJ-n0C7*I*Tc&dxb8qgN zO37ZcEEgw$0$#3fny1A_W{Y-=^(L8Wr)}}s1~p+vj}W8A=Wj1NJ~0_bQ77*gMlzDA ziaD|OIR-3+;&y{!Oo`)Ynk;lxWo2deBZ@vSRew15c4Huc3iWpUh_rE>Y)hp-g<&Le zH{keuLhITz;|h1cT!Lz!yewLgWCC_oYzip7z>IN(=M%K80p~hZ`;I)E|Iuu?sYa)VzoIsTlpM zT`{e%euL8*sxlP1%m5TXg=k8@re*;0W6dbS+!*yMck1_w`Bdv81gxX<;!+%jWuhnV znt%flAn3_x-3oN+@hpfsj6Z)u^v=T0e7VE_)b6mmU_kj`Kk?nx&&$MDXZ8qeLH8F+ z);SIay@+E|)%US>6CZ!=SV~M)TxuGjO3bW=gdnaRarK`LcBZ^RV;D?t?$(O#2U{oe zSbRFEYnBLZ&vwl=ahCTVJxi(ieG+_rteO^i|B+c9l-p|Htj-F#d@Ia%D&65T!s^8JzGjuY!P>* zSc#1viUkU*Rzi`yK}{vUBRz%Q^+xH5Euq0fAmdIoB(5o+*pQmf<@eXJ*`D4np;cGa zpPs&8@{#|nKmmpfvU!ruE6wrh*e7ecXa!4H-A zD2M8+WGrVW^J24^jITl*TI}VJXK-|Sl2z=dC(f<T|aBYW96!*?6Twd2wYD}3b+ z`dP_>EIvLZxUaN_>}0zWkKQvv=KR?_R8(HxI{w4;cZa%Rniqs0zC;qIk5@i!RKHw3 z{}`puWk?fJ^fhF8a!QzWIizuQzc1$1l-qKoXzZt!z$e^_q^k$Fl@{C)oy!+Vi$i_l zqt30Xlz3cvcgRU$I=sLF+* z9NSkekNmZx|LKoGmHj#_yQc| zr3PwjG#GF-1K7LlxmK=V%HTit@zfRzDL-(Cf9-zRv!qdgUin#dJ(^y0OG1yVJv&l9 z>uPIdkaZ7y^$eCKJ;Cd%^6dK_GLKCme}f&QFtK3WM&^Fc7BH+wJQ8daSnA0#Jwx!J zqyasTuZ>U8u9jSaub#$V(yf$R4D(Jl$YY1F2-2gfFJ~#*BtuzFzBn~6P%?#UCqyy@ zDcxtpHUKS16Swyir>G0!k&Y`*{OOhXGP%V}xal~>7vnYa#@xw6S>$i4OQGu} zy~2ySb!$JZ^PyQCoyb!u^ikQPo`70s_vm>!w1n(!*DV+v?l|Q%<)!lONB8d%0mul= zBQ*PwY$hsmlz= zSAAd27hzO>@Q2!aIBn#ZS%oQvzpa8f*U!>FUMhd?_4HaZt(}@tx?jK`)va%6N`VWf zPX7g*TNU)NZeAg^h-1Ry)vmYT5OHYjEi2}^YjrmDBzMIo^?+Lc&Cn>X2XDKib`8&u1e+ehA$`LuUfB}Xrnsoq^f@Lg=O)WU~)+%Va3vL`Ii^i?mGyUJXLSkSk^K@ z0$15bHlzJ|ioJ}oD_`vNOc36YRf%83*X3(Plmh7xmBn)YJ?~BEc*eK05q&+s5Oq*d)hz zzghcxeJEYqr)~R(_g>48;*sk_&`CM7)+r49e6^aHakjt4>dsj~ zk^^mdhY6ANzL-D!VS>KaeHCZbolDd+gndGz8MaRGqmCu;AYwr|}H{b~t(4YzW9I5c-6PPm(d3bh3m0;8x zUb6_Le(gpR8|;6t*tfwTrC~E5RL6(TT_YRf8dBEp@o7XPE45&lXe&yfgP$my+>5iI z#paN5tbB5#E;_Q!NU!>bLxraQ!*+}96zI0hupG`9TkZxiD^oCpiySxVbKB|8oMFf1AlHFF z-I}PQ5g(J>`MQ;5_b*cL0?nkTYQaRu@7g|io{V3=rbHKyqt#?!yMOa;-8RX>o3Uf+ zOfP$Ox2t2ZZUvBG{XkOnq%j^n_E_MdwKz+j&w-l6E(>k)Q@>#0pN%M|K;-yMKPH8n1rM_5nX_8)aGRT*KZT4X0|N)9_I`saAe)%v*ja4e zVni+;(bz1%HMGjjV+!^w&5)?Ll;*eU)!d>V8*ChEF*~?CeYiI0o)qT0{yE+PcPU=; zM+NX7I1hPWuObqH8ez7n6y5^AyYC30mX05dZd}B0)tG6n+lhh0)<}+j-jkp%WR3QPlHH{%JCEAtYom!=tooP0jv&+hjs}fWl3uHujPrjnj@*S<2a+y45 zu&ix-|1sDujoKoYYQK0ozw+>I*WIQbrb?8~RIE*}uS3mo^<$h6g8*-WIz+yW4QaY# zaR#cO&|hiDU86fH$-f&rJv}NxZqcdA+wpfApElS@u$QTUzC8R?RRqE52B=QC=vy)itzl&f4y7(FF0z zrNu1HLo-$!O(WK6an{xCAl@NnYne9n&gIV3r+Km8D>UVwxO3V~o-kC&=r}i$EvD8b z^5W~AvC@Z3WAAi11OmFF#2@G_;k>{vz@MZ2YT#s-vQ0!QZFG$fi{7wBrkkduHE%+2I_FsZ=|< zJkXdPUa*%|lw_$#8GN7pp262vy5e3T_>;ecxt9nlN>`qr=yuh#E%$;6GGpLvw(t_S zV6w*c;m*`+88X{LKRv}UDH0tlQVe7JqQ$4J+ROLYx%ozqpGz#g&6i^(JtX#g9{B4Z zVMV>i>fsJq;Q1b@l=qLuZ!ekDUdXzKZv%?yFH6TMr#OZUZR-Cd0P$Qid?#PaPiO@d zec*a?yzC>rx9C0gkIRKEM-0CGLBgMY;&;;XLAJCaQ*ce}-n~3lDgD&Doats=S_gK{3R@>I$1~^V|}Ddb}Wt-lQSv{B2<=A8!q3*2Sz3x0gmw z>)E%uYnINfy~{ZO0*l+~UIj=dD5EKbC=yKbt8t-gm&)ZC&Y_`9(Dbl%N9Ia8I+#Ly zFHUv}NBI=eJ1@ne>hisi+%}jSO7X<2v#c8n{|~p-+_RfIHIW24_o0MX04n4-xbJ^*0J#A;?4f;8(c;!!a8pM z=Cgkh%O+m6Qot-LbJu<0AM8@kjd&Xons;iK&o?iO^^BYY+q0W9{oir%zDfFFpx01B z-`_IaeAzg&g7r{`G~|bjKo|Ms6tks^2I`37G~e%|dp2JBj#7HmM>ewt?X|QIkH5xg4LX;&j=%nr9 zXBhYw1trrmCeo_=+3GCo?faheDS`4wP>y1>g8JD)^Paz&O0l^?4p+5xDFG+=Dm%%( z+*qH0<@sOgR`&*^)W+x$5|GYMEA$D7BIpUH2kan5Y#}ukbgKUqFGA$LEp$`fb&-S( zVMYVznMrw7BuD^>5hbQS4lc*c7ymzus=^+$vmzXTs_s+Sz&X1W|C~J+ zBP+N!BtTT)^QQQo#tL{NzX;2n&5XjCE)GS37Xw27qQr18BlRCzQzez~CJdmtS0FBA zJ>cHd3)7U+tOOXS?f_^^hfisPkpRjz;9AqJ1^$~xef50s^)NL&?h(CWtwB?p^j>NN zFT$A(;jCp$TYC>*d6gE%t?fAY`9DPJe;_!xx}7d1xMv=5g+>|pR?vuhzC>At8EykY zH}_3_z@76;D0Y8-0K*eC{Lk&(|xTIA*+gzbR^XYDOUt(}ECP zz^)42g3N+j3U2Fky8dS=br-)w@&`8n>J5qemprulzaZ}a4~V;-Uf3`2_tqWILsfi} zR9%pl0AZGv1GSW!rvyM^xLcaE9q6~Tn{`K`_t479gFY8Hp{aV_7ts5c3>K&O|FY6L zreQa$RY;Na%i*m2{>!_95IUTGm?i*d@25%MY*iJ({|~>71QuJ^MnZZ3@RPK9mARk@ z{P{Wl&CxzLD9BKDT@45Rzv%M~otsj@A_~hfR%1hW9)h#%J0C%PPiPg#h@owOi9Q8g zK9eJunMFni!~d?$|M&(QYp7&sk-o#ZsOS*+vBbhMF&hc? zXprbK%{y%S*=n1mo|h}XPeNR9t9T3i{SZQKsFQhegtn1-g zT65Wb5V?=H-}b{7+q0*f22bGqCQ?n?+_V$Bb0b&wZ$#hDizp%JQLF0h@=f7mcET{eX}Vq)~Lr zS-w``L4i@>y%<8sT+PqSa>tA)KJx%PRLqOQ!ZaD4|FtAItQ9wRUjh#@=Ob*hKLm4p zgWiKfvwhHE_#UI@J32Uhi48%KRac;$E1y(OkQhZUQ&hxK`)r)O)~YYQMO|IJ8_-(g zEG8t5^DR0MDyo=;c5eiF3FG!xt$5drI7ROq-{Fxy@s8Tt(=d?T!{F8Emf+#+-6k@KgX?V;_ zjQ~4s_kSZd%plZ2G^5eg7Ctp0waAKKpXuZO&!$yYx4n;ykoSCc=^q z92n=9j$&u-1$`jP)h2=v2h{TjOF`4TTpPqFLC-lO8zN37#1c4<+t9F^2#hnC&4t5P}}bd%)L;D<)Y% zAEn|!_HE+&ES3t+MM%t%vp8@gXMN-nE(BfM@cm=9G@d8yX-^)nm9Cbc(k~vOI32#P zqL+FfnrZJ{?wc6|cBYTr*dA|2f4)+&PTfvq#e3w?_*$p+!0WF=H69yepx&tNJMs{$ z#&?GpldBRvuTkOmQ>3|&1{~9Z5d37|v(hl3y9{X1-91c5LW9`J7`UC|AVRUmP%f_v zWw|E04M8VE#}e2X;`_)QOhNE^HbbqTY>+O@7TP=2DC{&OuLDuO`K9Oec2{hoWupUC zT$YllF!A>1?8Ito^hldvZlO_eT_22F(~_X)F)uJiroAu^aBm!;zM|+olvr@k3{e#J zO5x3iN~WMQQe$|?v&k7Y=ej=3)Q{AhXqiNxq@b|ww(?q*|7mAYnY`^8tOzb^V+iJf z4(Dkg=qc7kgI}DX^*qjUE4rsqA_VE|g-OpN`?VO@5HmD=n9#i7>)#we`=**6&_kdY z^cc4+86V2-TR#pd%Db{ZIP{YtfK9YZUo=!(y}5UUBl$nVfL-z98cK#q`7Oxg_Zf|!}q63S~kyL0jjSXE>PDcTAKbBJ1@~}$)LhNk~Eid7AEw}}y9zC$ZgmU_z z*zLSmcjlU6IPwD?X-C4sp)2O&N8)K?KWM`5a-l`LJ<}wH;z7&O6qu}y_{kQARB@f=HW2t_GYAWK4kg&9smRhU?(}L zKt&PUehr*HNNJYb^uIAWBrl{rj<9sVhK!YG;|isMGR0|?alHz}_;IsyEiaJ>3C2K3})Nm3}!GXQC~+-@9rOih3^waak*07l*KA>@P~%R@;Z@a z!wvXUB~GcMJCRl;b_g)9B$3&2sVlSyK;T7&)n@ zf{^UF)zKgtc$`VdvMeJFypfO%AyNmVvLN^~M%qnpz)U|bRJ2hn=>9-GumcX;!q||7 zJ9x@(F`*bo?_%XmL;N=PLD>Py=)Wznzg>@j+vWQkcx+CnT^?5lQ-F2su`QtiitRNZ z(-(;qoMDj9xI|27{0lpw&qq5|!-@tCA|*4c_E~+h0efintp=6EA_bR0cj@@6)tjv> z1WA4wka_g!8spc+W<~W+S@}El{Fz-Hi9O{<0N;tiBWHgQa*N~&>=?EDcer?f5A{bVTnAu!gvMdkP{xd20%f^^46h7oFM=LxL5O}@k&t3-(o_aE-60GU22L40 z7J#hCk4e&iK_`Q^VH2y4gJFCdfVnZbuZTK}a2}TeI|Y7=dmLbhyoGE?O#3%aS)MZA z$4yB^ht%ejS5j`R;~>zgJYKvFm%8#jmgTD{MIbUMHgZOPH$S_6&iGuSraDQ#{MukV zBWELa;3Fq}m^T+6$j(}a=mvc?RuMTivL0eVL-Tr%>96vi+_p!v$K_io|`1;hwJk#A9BX9fBii0p+)y?po0Ps{Ro!Vi@;`Q zpQlKRxzQ-&Q(1ANf2xVODho#8Z>Q@+WNQ8o5s)Kk?)`b|xGx2I{VIQXCc?;#cy!gbun%vKIqVz2N&5m>^Jj{@P)j)}OJ_ z1Go&|r_4{TBTi9)MvQ;-hd>Jk#Jw@HviIu+fOfKs|hVAYr@4i1StI8 zPpcHE3U+RvSb0j;0+yyv>E=P1dMbDSRhU4%mQlkd+N7ItDu8Fh2YCeDY*&Ut^qz1+ z`LU{>vnho}Qg{VM_dt#`MS6Pb!8_!JFO#YjWixO>fgzUesf7>z8po`z!fXhA2lz;~ z2K1TzY@EGMKHk5CI+>8S(a?!7{6IF`-gks*+~zj)`eN}9Wiq>#x(@>a-K%_6FEiz) zhs04YoLV-Z#eS}-3hOn<`*pswvu6oAMHgl{)ZvLFq9fHU(M(#=wG3iaiA{u&ZAI@~ zfzn;i4>sDdJ64b4w4y3I?DBk7Y|)D(qQmUbUO@4CFVPNbVvS_6SAs70RV5gt_uI0F zE^fc=?jH`=@1g4X_ErPayx&5OB?eZN{#bRJj^1G)4gnb!{)hOy|%Nnq8z7&iP*n- z-?quwI^X}geWN7%u6(y-alJ@y1Qvm!@9t{4IWI_FQJ(6(Ahzi^-keNcZ9@y>WF?zJ zKkT-`9zYxUCAJpl`C%yx-&&1-Frd11jrKRSD=3}}o}zbI$OQu&xeh{83l5QS9lTc> zHCC(|^K85%+8rTd2ogAEA0h-@(5yUmgHXBN-G8o6Kf-Jfw{kvCEc&HAHR>u|Ll21> z9nF~TPhz!Uzk7loujokSSPxF<8nPl-5i76M!1!-t^LiAP!-xT8TtkE7wxKC^{+z{! zuIUZ9Tihxz8h`uK*Cqco3WrgCpC1fxt92Mj(2=k8+?wJr^ZD_Lr?wtMBOxrr)||;S z@DMXeegc*bDvtDmJ=`<&%lm6t7>Uk@`ndt&ytq>wy7HvPVYjeLL5IY>PuUom(BR&H zK0uCViMj9!agkEvK2nhBpxPq56X6sW!Hnj0`)+yg7z~Rhf^%uI;h8QT1pVZF=gD_~ z5z%-2h@kt~#*BXu#TuU&LU=)b*b0D*pQ1{?#Rbpw2Ac$Pb?uM`z0Fu7@QuZpq}S&j@HvDozh6qlLb;b zS%Q#L_W_u6KPHsXY47D4D6b~?_5w?#A_PG{hZJCT96ZW6UEjk#3#aPJrxhC8={&C! z&-eDT_<*LBi3b03KK;>}J%=&G0C=&E0OC8#fEHk{M@xEVALz9rPx_RECid1@aR7B@ zIFw0cjal$oZ>l)V5z426lXrV~3mlu4_LQXNSKSbA%)@X&7kS0Xy{=G9o2k2l)niI) zH=OX*#VMe$5${&z2>={ytAR0C_(br|D(EER)2JOI!Cn1&%kfEyUh}hYm3hx;Q_HDJ zX!LawF!Gx6 zV((*cNBto<<&LFKU5|upPoJTv-D87=G4N;%luQyyzLL^}KhIIJX0((97bs=TTr@#* z(*R)no*+unYum_m-nFj>6;2=%D;D(|(_~Yglx?0^`d3ImY~2=kbGbZ)Tk??tl&(mH zjhg5EVaKqy(+XWoO#*F_taCaebX#7#)reG^g(&O6M1f#yD2oFb+xL(hBh?gXOfyR< zOzwwy(#E#@>|0;{TgVFBq~Il`q?v5%`52(09@fxZlwia%Qq2~$tAj@CsziAm8)$hi zfMRswilcH}O|nIuv|HATV&XYqZ#acCNDByPUYyNkvQb-`^xVM+(Pcv@WVQIj{U{Tp zsND|nAmOF$=%v-dfm+gcXS;kb#*nbS$_+f3UC#60P5MQ#r?3V_>v!H|*Uo`5Z7~!q z23ZvKA;pCmeh) zV9u?Z=sfUz&LR_CRe)!zT``i#O$yqd?l^U4?bRbYZmK4>DTW%dzAn%U^HUTH%OE#@ z_DAMF%HzfZr-Uv)LxVpxh~Fn)2(h%PV%89puZ_33?5<3erZQlGd3gCvg)SG;!lVb0 zXZyX}GZLUv3>zjL2T~8in#x^lA+*BO3Y3{-f|H-s^R-7*ZAO^!i4u~Jzm|SEuryPc z7PtkQz+}inulcHp4I@R<_#}t51Z~5^WW@N1ZvBq8_t$+Zl9V49c_W!Zs%cVIK|V}^ z1ji-Jw`(jI#;~vxiI+%hzHxGqekDMB{BwO#=Rtj_uu=b*(we@go5nbqvz?^I{ZknB zzD=(erm!AAc_Q&v$Oi0lRUYmoc1plbEe>RFi`wawyC15gho4Q-o*iRALV?be9Q) z<0D|^==}s<#HcpnoEmMjjX(>2Vj6h%=%%=(U zUxwXR4$+!?z~0|EIXx3vg?P!Wf0KNFQ)x6%ZFh8d`4@L` zAf=pz_^=_w9%wx{L7GGl1D6;xKhbabK^7lb`F$S#${zA_&Mr<{>0{ zh-IOI1pZBia2*DAb;QQew&Sqd_OsI5sXA~(78<-1P>;{a)LF)i`zVPWIafI10(7Yh zqPUxCXyB5tBR|tfGiMSWsNNxlk3u?IrYAxBuEKqV84u6LDr%x9taW6}!arTFW9r<) zl>Vc)VmI+1lOl3^dr;0sA_PeWWCk3BWJHmXYOp&$to{0M^Vd8K6MhWVfMJB29S5v( z73%q(6b)3xz;xY@b#}TDmZqu^%O7wGX1=0BI%(^lmNv8;j!M;r$7ciiET4jZQ&jWo zjn*_A5c*djf9eMbQ~(30Gr_QuvjnVq(c<(QUp(t~ds+CUzMfeF^X9IUa5tI?LcYZ3 z8)ayK0UK6nILwkV6?LfMt%-N6LwPPAue=(5IG+Q#Dif%!v55)y9}21gZdH!&d#v~?3gDN_FEJvqF-+5p>jg=op|KUK9# zE2g(Wj3h`O^ruam`SZ}$H{|hK+-K6~Z1LPO*q*NocTTnmUAmb&coa0g zd<;$!OE=DEC7^xqZ;FV5{Qa@(NdC^nS54%!-sDB=W&l%;1BO4Dz$3oi1g1qQ$J?>D zD+dLFEOnhOm8v7Saj9wRwpU)~W)Q%J)pgT4K^-V}1uA+%r&_C>EBSyyW_KQF$xqsB zGA`Xwq)gRDwMEn`J@0Js%YDQAwlALq%a&=57nm`+$)Zl0H$+fdW_yS?&5IWxyVuDq zEcRo@?_WuzGD%>vwUV{CXBKv*}vt&R#OUuClz1{PMN~h zp2cp8XB)SsN@asPxAg4?keX9?#s@jgU{f;4yP9Ld2t?wSKV0nMFV7VL#>y?SaODsr z3@-aXxN`8}$CpSsS&#Lv95}>`mp>Dk6(x=R2K_FNKx=GX?NR0NSu3D|WW}C#g-{iM zgJnO?G`lSRQMfuk_8&OEu-V!l0`6&tYwBaQ5u)=uKqBsKwNCSNMg;qx?p{Tl8-o9& zRR&ToE|2#fp3Pl13o*|9@#=M73^>%X+i5&I{J!Y&{ZP#ZDJ*v-(y=I99dI;dj=x!D z*8Hc$8_h+!NmkL#YzkFUe{Afld*u-5wH&N?HupPcqt-9snIGyRcf95In<2VC=e}Fj z`X_#NgHru|xC?7jttTS^C!$&)2S0fc=C`%Cf9NIUT+!w&+UzUYk-La~B$}TsxUqA} zkfY@?E+IX+_o)WCaY;1V{DY9B2Q*AP+n!1XX2`O zuG2!aGaRY=EZFeeuXJcmB9IeVvXk-5CAZYRdZ=%S?rD%nu0hhOP zQL2;_&~sn;gNn$ZI2*rm>g5G!%GMo+A0e#hdvL&ski9xb-2U%%ONr!{_W?{Q`+VZb z_oq6tc6d^UcQrVQ$K&6Q^EBS4Eq^P-o%?KqTLWbzIsL7g=c@P7lWg96mv^~u@wrXy zw^%f&=AOG$guji?;vKuzZ<|m~|7VxzYo{CNy4-AC^}f@LY+hIX^my9jji(izy-vJ! zo`oY`-)AdP(oa6t8h>pSrIQ@8RkoYiE=wJGt=%~LO-6_lK_*Q?~S$OPx7pl zBZ(NaC01gEv?YGLB-eJDty_J@^SHr&vcvaKG;LITEyHTG?ppQ&$aC4g^NZ=UAouOs zzNW@JIfUPPaD`bS4qk;-F%&LEj)k@4%I3rQ*Ta4s{yBEzQVbXE z<$f0o!3yz>)@cg}sdbdpV#n25E}_ducWuvu(Owb5rjB~wDr3`5=AA6LO#c`z-Hy^W z!B-bqj{fGUCH?~y>kI*l88h%+llS5P->-(5;KcT>38#lG%n+c+vNt@?P_-TcSi6|l zn3P!TSfW@eSO!?O6JQvKdskxD>#mfpw62VUgBdhzZ9Qm)YIhT*zB7hL6T};}Fv3xXoBZ=K298lo!;` z9N8cV%=ny??HE12D%d@d?EBV=%jmP@!rkaJQ8wnA_Fcqr<`;$r)%Ujb5KN+$ znMeLxoeY)1h4Dbk|6!XFPB;2vcH4N|6vsG$FS4@F(CGD_$HC?nf3BXCR@$Wec`R#K zqGPE4O}J!Z!}L{0)k^YQ$8#TZHBc~af9zwo0yt4nI-X`c8g+NM$jYB?JsQPx$xX8Cxq8YFwlKv$>;Na-xj%O6l^CA~?TtAhC{|Ui0mSl3g729vC{IO|v zY!*xtk;T`8n$$ty2ZUS zS@Rh+W({B=8W3S~g+1cpP-BDb76Yk-&XnhQ5 zRzZ=FhR)v6cKX|yvI5IyJGWX`IQ;>KaLSK9JDQ3crr95{O!H4eArk0K&!&;E5B zTCL1D_SV3sy!+HC6Gv@}N1*=1>tn9I_Z$_d_FzwAJ+}z~?W_lX5jk8teR_PbR;vOK z1HT01fbXGX^YS5ssUVS*q)!YHaqfsw&TJHWVp&!lG^0$uh=}|N-P7fP_(yiAnP`PN za$@cW;HfXHjw*y$S~P`NX4Ii1v3KK)C&b~$GJ|=!BgUFm_ZS^8dniSjr!?|A3zm&# zXW_TG*)gf+r22huF+DuORP7>*;v-HyU+5%0)2j9?5bF%=kSbYPV8+`cV(yRvwR`=E zb}Nz7-3(PE!}`v~g22NLDFfC$B8jyT2VTEJ+U#kWqxZ<^Rt6c_{1Pl)nF|=={!v(z zcH(+k>N@C^OqI;vezfVhxm{_;(dOxmTttVQ5`t`!9mf>+gTTw~2K1iKVN1Dr_@F*n zg>mW%36Fidu748n(%^i47pF&zDe;7N+|1Eu$1#esv~GL`wA$R>7o+26@fgwU z8D;7@bK*~z?-6C#Kkv5O+z#*wZKa8k4Js0na$OAT-W?rvLwSfv2VEG+R*?L-4S-7%T%Z&ELG#1T5!HP03?#GQ* ze8Rm}{()z@xu8f*bu$94`=W^c@IxY~u`Yqq^M=;m;K#M{_sEXkH4&;#-?$Nn?aKqv zxWM(az?sn`EZeXsKb4{<29|UQf_8!PO3jb#s<)M@ZMn@>N6l6^a7JLmJ~xsb#m|Ol z#K7nYygk@HBR-U;Weks`t%Kyg1z^tO9GDJY=u|xgLeTm@3wuuTkzHYdNVHdr=xY@-8t ztH%CUlDCLH{}j3WwWO-Du4QB1)vs;ycZ!9I_octA9D-O;PD1X%j&mEDtn>HpQJ%fST97Q)IJ%TV&#`NH>Lr`~J9jHWXqyekE-ECtB!b&)A=iOD zDK{hOmSntTVlQ`NBjFOghK|c z&Wf^T^4m?v7VPY6ZtwBsrJrC%**zPu(oXbgW98b{Q;j~vqkURr$V!=->l1kS#(CW^!vq-CE%RxzL&HwtI|N9^45C8{w?!^6^&SA6PsAtlXMq+d3En`p~KUx=k ze7iEQ73?%}dtvlGcYHF36T~t4>y0TF&QIZBC3^2I0?XjL^mi2BKf@4jmSaWOX)Cj} zC9fUbPpl|A$lds)_2CD4afaIaq0xO3g5=?`+0=KzZh_R3C(}p?Sdo^@xhHZfH-kfb zxqAZf2ea!lBxRZOmKKhU6?#gD%6v>h{qY*8j66Ooi*@;wpbNL5tIFjn-Y7x+2dHn^ zH}M-3egLDkwFDn3F%wIEC+p7g26i++an_~OiLOD8sVO~?m`UAGU(W>d_}rZ{ z44bdG(;ANuQMA4{#r13VY#W>6_?um|rgAfxJ%^FB4rYv`iH9w3-kLbclhzOwvGw&* zp}*JlpQ|e>kN(V0F1Gt^5R);l#Fe4hQ3)GtsM^-F%91bL#U@XS>MPv8KC=5*OP-7l zPn}wjfNCDmX$U+>voxhDYpF)(EJx>}o0WtT!fIOsL)M>;@i^>TQ+1Uos&LqQgvTpP zN@6!2_`KKe-zZP^uAo15R^EHQvB25a@no$1TSB7&jdZ-*Lc2c2sdH+NQyw3(>TsrA zpUAg)RA_HXVspg7(aZ`coL2p@c26P`6#EzT`Iez)I6h^VO5{o&@ku@%z0vdPIag1Y zKhbJ>*m7+03k=Uhd(!g@FsyK_Sw~pTaQC#~6s+r?&%?suaWVzVr2jFFb~m<1$bJ7V z=2PKNa9gOA1~e6QN>^uZ9OljV&G)p(OQN?>cs@X#vXQA94zJ1S^S05Vw4>}XqWfAy zlqLs^Ma=hyG$;DBG)pEVOlPBwG2ubIW>)vW%)sVa$QOC#MqND=suz4;am?tJawL z5@XnR{1lWJ?lKndvo`OOEez&_e^%0Er4-A^0GdJ~y)eTut%yo*zPfAvc(zI{#vJcR zhgRRYB*~V6Ta@nsz16{omf>2YM-XdnBp^^!E^#XS+H zAxLSdcaTrBX0rDX_j~Ul=_f9Jc6;uhkJm&|e|-@UE|TffGab7>L`17ao=9eBXkg|G z#6`}`vyqSCksik?kv|Yl6&K@$x^$62*n#0}^Yro>(jI>2hAMywECAiU57EkmU$o0B z>ozSHVz1RwMN^_JuROO zF7W6^ihS@+h!S`axIosc+gkv?(;C~)a-sSM=o>5a(- zPI`;+CJLBA&h-vF&FNTM59{U~88Nw2loz*-6&*<@Ut}0vPee}V)75SMY{1ikwswNx z7CFAV2na~iEJ?~*n$bBWHS(`|^*n63M0xoWs_esJRG%M&#b`0$E{?^AkL!s#g(dV+ zub&A-pmO&-lj(j+i!NOr^ju`nAIPR5^}k(E18-7rT5J4Emi^_az|m-%cU>PRxQ9-A zRvV@})$TXn@76^tJ%1itBx+!+PCgccJXd^;S%UY^#gEn zmMlRs;)4No4~MSTw>35GSku&*6vyzn*@e<9Gxj05u(64&)*uB-TzkG6ds?e8EGlA8 zdc8>h5EVO>m81xQK2{m|H~Cq2B}~i5f!e!S%IMsHKjiF&=}6~Q#!wQDnfuGo z4d8B=Wl6@c$cXtvls-C-f@REcN0R^pa!AHr^5{J0ww`dReD+{L?%S`UmC6jfZRjc- z)*j(;W=l!`IF!H6MO`cMVx2#I`-@`o%P41>Xbbh6>b3V-rsM2 zGxKFi!$n^50$Byd%bQuDF8r8Afu}&NEr}RXx9-!B4@t~01AE2gK!ic2`zl)Ba=u&B zmUC*DM33M$rIv9_Nu52pwWFi>*?dTG`i+(U-!Cssk=9JVUDV6_>(?Dz;^%rxNXH&5 zz}!c_`>e!QV3cteHtcsMVyDKgApq5zpTp$L>aq-^s%Z%h^;T;j=gqoPj3+EvSbS*y zU+)R!^b|Q6Q@D9cDxY=kXI^xyV|-j=gzUSyI2jquv(XAd5FvDma9b`v8}2D@^cZKG zG4`+25K(s4afQX1UoEat#PQF9aIrJ&KKSA853BC+kB`pR4$+>n{xb&*LV#$wC#>~i)N4CwH-JtN8m%2U~(o;1o z0TdiZh$XDd$S5(7oyVfEh=?+Gp)+Q`WQ}|Se*|;DtoTzaU;ojB^8S4UPyPXqB&9D zFTq6qu6~xqKQ21Ryr+`7v=DU@Re$eXK&tKy9&4i{B(jl&?p^K7ofVDVtbT?X;0gZ| zZF^n&h#g6sGLVo^x25v?qj#SZ1zCqhU9`w|*RYLdzKoW@hTz|Rv~^Bjaw)Oi0{3jp zMWxr;W5irM!_~M#%ZxQU2v10T8}XmuVy{8#;f=3HvEOV6@LKihdalggl?)@U4rcgf zBv`q#QO^9e+6uOVIfs<&C0XxU(k(E5EA%|ZMzVb^aqRJ9uA|fnag|FCuTUWSE{Byk zzsRN`NC5=4MTwftxucKa^zo?S-qp=R0w2+F0wUm>pb9M2Z&KY2qmG}i0%tS?mtM$W za@@us+xl(IW}sqgX`zq(|E#N8a+B~~BhhS@mae>;U5*bIX;vG0h%FY+DPf*q)nU?j z@|WF%OJD9O$n!n_k{7VWXwTk%>v-P(`od?D%Ul(1`JS!vN$mbv71x1-E5Mpu>p|@N zdwZ@eF<<|_a_;HuH(r1AR>?b^)4K9EW)t7{uZ$hPSr|I%B0C)&lYGVP!c-H1)j~vs zz`oDLGkje4FVn4-E-Nr9D3qVitjAH~7$^%QkKHJI;YTMj-^(uD$^&6QN_x0&G+ZSY< zvb%HqKtrds|qoDXfC_7Le*p2qRk>!Il#PWaP70@ z1t0dMlM8~86Z6Z-(P4=J6~HcTguaT)n#YHhZDJMv%%veFq9WSBD8azMdeGCwF$8$7 zm67TNM`N+Qo5a3|B!h5rN{U@O%pZH|li zgowlKQ$r(XykHak8@B60@?urvZAlUvUQ7j^fYso`o+Q8!sej<$+)VJ2VsMoG`TVR5 z)EI3LllOj7?LxIPwi?pnN>n9$CmscBhU?DKbLv(Gw6wj_qAD>$r)ePFAXlq-HuL`~W7uIjl^CY3ZUEj4bjy$_Of z`Z3voj(o$La(_Sd`w2h8qOm7jNm3M632 zpM9SItgq|${H^GfHsImrH=a0ghEG`1)RxYvjAFs9-KNZPIw#XigOHipn?8^Dr#^E25g zGgY`*FHfwM5K&-b?F5!-45Eh*9NjQsW7sSsX~?W1q`q45W<^?;m$=K5icZP4u2#*4 zqlcKjPrLK-R0L?Z!1(FqYA6K2${ zn4uHn!=B(XeUC?lZ~yn7zR`!D*P6b3`zm%aBoJj!SWkU<*e81Nq&+`v!8@Jq{gGP& zbi>^0dpi&0aRrNP7Als|5nC2%id+k?&{}`U6mX?E9U4pI~~zt5jU=V@MIMi zuuBXap@T)-ZmEj*a2>#*bJ60&CyX&`)+wOG)v0|Fp(fQRLW?*ABo`_qCz_tkN}0(8 zFIkqEpUy^%u=(|giV7$RnV^Khl;~@U4;7Uc3v4>@)Nr#f*zwlImw{E<)q{xY6Br(M z*Y6BU)Z=lR+CKH>jA?K;r=PFZuL_q&O6%}DAYiMtVN=1dC7SSgeE4oBa#em(`zN2r WeDmFT`xi9~K;Y@>=d#Wzp$P!{Ug*#O diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/add-missing-default-constraints-to-columns.png b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/add-missing-default-constraints-to-columns.png deleted file mode 100644 index 58b80216622edfe759c309d903b319a13c7ab528..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131401 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%0D-}xMv)czIVjQ?vo=OLItLur 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%0D9EtAib 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 diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/fix-schema-incompatibilities.png b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/fix-schema-incompatibilities.png deleted file mode 100644 index ec99098339aa7f2f5613fd7210f3b249d4c634f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50051 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 diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/prisma-cli-introspection-flow.png b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/prisma-cli-introspection-flow.png deleted file mode 100644 index 7b12d1ee243ccf19e6f894aff22ad59cc488cacc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30299 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%0AwQoYMR(YK4B5Cl{t9!oqc=%w3e}Y);ky~ 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 b&tdxzG{1FCtvjd_fj^g3wN%QK(3t-Ns@@A@ diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/run-sql-command-to-alter-column.png b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/run-sql-command-to-alter-column.png deleted file mode 100644 index 456f7a91c75de4cced04ae0286bf47cb2e1a9297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120846 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 H6!ZT81a0ma diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/use-t-crud-to-generate-resolvers.png b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/images/use-t-crud-to-generate-resolvers.png deleted file mode 100644 index 774c6235d099e0b0a7ac1427e58de1205147f67a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48878 zcmb5V1yoes8$OBxLk%S$14;-er80ydT_U1{NJ|c>ba$tSgo1Q;gLDlshzQc114`Eb z0yDr6_u%*W{r-2YyVkvT)^c&ycxIoy-?R4{&-1+DFO}spbGmgR&X?6FRZMd7gftF{%^bVa@ zeq9UWpooTtc}ZQ1?jyCO>3N5uZ|Swo;wBa5xvnMSJMj;69@LImt|-dAHy$AB6OKs2 z!#9Wevn96UQ6#ZR`CnrWmx^J&o^_77@2e$3yVkq_H^hdpOt{s8+t!y0k?+f(z_vh#21X*0YWnfa|??1^VoVTCbI_X}5 zs2lg~swynDSH8}Fi*9#ldfIixq#7^Tsdi3aRZ5k97 z$W9`_7O+P6&uGz!P;JT07{5~B*@?x~ll@(4lYOTjJuZH4_sDzbm2P%IJH%m6vRt+pC|SOdAZGa z*eqt{U3_&=t8@OS^7D|B*Ku(%Vz8@}$FOe7dEW0hY$;X5rFZZl2M5P`E%bX&&rjj& zz?l9WJmA-M^+^W=CH(<3A?BUyvIe`DpA`csDUbSx;ntXDMIGNV;fAWAEx85Wtz2Pv z&WM11bUEeActeu`RO_4axcS4tH4^;EzScYoIO9pse0O<;<#RpS%-YV>8H2a3{SWp$ zx9S!9Fq?RBj73CB`}N&a!lTjHfYbecvkOND+ughmaEflhgwt+L$=A2)Ti+OdZo4>) zBH`WQiZa}vFf41JLFRa6&glA;pk0^uD>MWXW2aYEw@_Q-Tc6s>r^e#vo_Qj>JQCnu zu;{W$)wKd2>lDvE>Sc9z7rL7ApOz7RyC}i=h`F_+2+|AJ;ye386K!uAZ65A^=UuxO ziD~e(Z`-i8c|^Jv(Xx_lzUDf*@BC-MBEZijT>QSWSt|@UtGUP{Ld+jJqs| zhBo`CVLZCwlcJ*Vt?JqJ)6OU#%;skZEb}0$sT|2zePCdvIQy;Y)u=;3m)>;!WNI38 zA~l7t!>VACeb~ygWUsWb!68kU-?v8i(I$!77ssSV-{Y6hAKf$`Oy4018Za0${pVP= z%d�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∓z!5_^qjn_sxM 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 d-^uPnMxj%;zV(Q`9w2Rh!Yd}e{{xU(vjhMD diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/index.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/index.mdx deleted file mode 100644 index 72c38f9174..0000000000 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/index.mdx +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: 'Upgrade from Prisma 1' -metaTitle: 'Upgrade from Prisma 1 to Prisma ORM 2' -metaDescription: 'Upgrading your project from Prisma 1 to Prisma ORM 2' -staticLink: false -hide_table_of_contents: true ---- - -## In this section - - diff --git a/content/200-orm/800-more/600-help-and-troubleshooting/500-comparing-columns-through-raw-queries.mdx b/content/200-orm/800-more/600-help-and-troubleshooting/500-comparing-columns-through-raw-queries.mdx deleted file mode 100644 index 146867f787..0000000000 --- a/content/200-orm/800-more/600-help-and-troubleshooting/500-comparing-columns-through-raw-queries.mdx +++ /dev/null @@ -1,211 +0,0 @@ ---- -title: 'Compare columns of the same table with raw queries' -metaTitle: 'Compare columns of the same table with raw queries' -metaDescription: 'Compare columns with inbuilt raw query methods in Prisma' ---- - -Comparing different columns from the same table is a common scenario that developers encounter. Some examples include comparing two numeric values in the same table or comparing two dates in a same table. There's an existing [GitHub Issue](https://github.com/prisma/prisma/issues/5048) regarding the same. - -:::warning - -From version 4.3.0, you do not need to use raw queries to compare columns in the same table. You can use the `.fields` property to [compare the columns](/orm/reference/prisma-client-reference#compare-columns-in-the-same-table). - -The below information is kept for backwards compatibility with Prisma ORM versions prior to 4.3.0. - -::: - -## Workaround - -Comparing values from two columns in the same table can be achieved by using [raw queries](/orm/prisma-client/using-raw-sql/raw-queries). - -### Comparing numeric values - - - -From version 4.3.0, you do not need to use raw queries to compare columns in the same table. You can use the `.fields` property to compare the columns. [Learn more](/orm/reference/prisma-client-reference#compare-columns-in-the-same-table) - - - -One use case for comparing values from different columns would be retrieving posts that have more comments than likes; in this case, you need to compare the values of `commentsCount` and `likesCount`. - -```prisma -model Post { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - title String - content String? - published Boolean @default(false) - author User @relation(fields: [authorId], references: [id]) - authorId Int - likesCount Int - commentsCount Int -} -``` - -Queries (depending upon which database) could look something like: - -_PostgreSQL / CockroachDB_ - -```js -import { PrismaClient } from '@prisma/client' - -const prisma = new PrismaClient() - -async function initiateNumbersComparisonRawQuery() { - const response = - await prisma.$queryRaw`SELECT * FROM "public"."Post" WHERE "likesCount" < "commentsCount";` - - console.log(response) -} - -await initiateNumbersComparisonRawQuery() -``` - -_MySQL_ - -```js -import { PrismaClient } from '@prisma/client' - -const prisma = new PrismaClient() - -async function initiateNumbersComparisonRawQuery() { - const response = - await prisma.$queryRaw`SELECT * FROM \`public\`.\`Post\` WHERE \`likesCount\` < \`commentsCount\`;` - - console.log(response) -} - -await initiateNumbersComparisonRawQuery() -``` - -_Sqlite_ - -```js -import { PrismaClient } from '@prisma/client' - -const prisma = new PrismaClient() - -async function initiateNumbersComparisonRawQuery() { - const response = - await prisma.$queryRaw`SELECT * FROM "Post" WHERE "likesCount" < "commentsCount";` - - console.log(response) -} - -await initiateNumbersComparisonRawQuery() -``` - -Running the above queries (depending upon the database) would filter posts that has fewer likes compared to comments. - -_Query Response_ - -```js -;[ - { - id: 1, - createdAt: '2022-03-03T12:08:11.421+00:00', - updatedAt: '2022-03-03T12:08:11.422+00:00', - title: 'Hello World', - content: 'This is my first post', - published: false, - authorId: 1, - likesCount: 50, - commentsCount: 100, - }, -] -``` - -### Comparing date values - - - -From version 4.3.0, you do not need to use raw queries to compare columns in the same table. You can use the `.fields` property to compare the columns. [Learn more](/orm/reference/prisma-client-reference#compare-columns-in-the-same-table) - - - -Similarly, if you need to compare dates, you could also achieve the same thing using raw queries. - -For example, a use case could be to get all projects completed after the due date. - -```prisma -model Project { - id Int @id @default(autoincrement()) - title String - author User @relation(fields: [authorId], references: [id]) - authorId Int - dueDate DateTime - completedDate DateTime - createdAt DateTime @default(now()) -} -``` - -Queries (depending upon the database) could look something like: - -_PostgreSQL / CockroachDB_ - -```js -import { PrismaClient } from '@prisma/client' - -const prisma = new PrismaClient() - -async function initiateDatesComparisonRawQuery() { - const response = - await prisma.$queryRaw`SELECT * FROM "public"."Project" WHERE "completedDate" > "dueDate";` - - console.log(response) -} - -await initiateDatesComparisonRawQuery() -``` - -_MySQL_ - -```js -import { PrismaClient } from '@prisma/client' - -const prisma = new PrismaClient() - -async function initiateDatesComparisonRawQuery() { - const response = - await prisma.$queryRaw`SELECT * FROM \`public\`.\`Project\` WHERE \`completedDate\` > \`dueDate\`;` - - console.log(response) -} - -await initiateDatesComparisonRawQuery() -``` - -_Sqlite_ - -```js -import { PrismaClient } from '@prisma/client' - -const prisma = new PrismaClient() - -async function initiateDatesComparisonRawQuery() { - const response = - await prisma.$queryRaw`SELECT * FROM "Project" WHERE "completedDate" > "dueDate";` - - console.log(response) -} - -await initiateDatesComparisonRawQuery() -``` - -Running the above query would fetch projects where `completedDate` is after the `dueDate`. - -_Query Response_ - -```js -;[ - { - id: 1, - title: 'Project 1', - authorId: 1, - dueDate: '2022-03-10T00:00:00+00:00', - completedDate: '2022-03-12T00:00:00+00:00', - createdAt: '2022-03-03T12:08:11.421+00:00', - }, -] -``` diff --git a/content/600-about/20-style-guide/02-word-choice.mdx b/content/600-about/20-style-guide/02-word-choice.mdx index 4560a7fd78..920f6d3e51 100644 --- a/content/600-about/20-style-guide/02-word-choice.mdx +++ b/content/600-about/20-style-guide/02-word-choice.mdx @@ -107,13 +107,13 @@ This feature is in Preview in versions 3.5.0 and later. This feature is in Preview in v3.5.0 and higher. ``` -When you write about a specific version, make it clear _what product_ you are referring to. For example, in the following sentence, version 3.11.1 might refer to Prisma or to MongoDB: +When you write about a specific version, make it clear _what product_ you are referring to. For example, in the following sentence, version 5.11.1 might refer to Prisma or to MongoDB: -_This filter is available for MongoDB only in versions 3.11.1 and later._ +_This filter is available for MongoDB only in versions 5.11.1 and later._ When the product is not clear from the context, explicitly mention the product name in front of the version number. -_This filter is available for MongoDB only in Prisma versions 3.11.1 and later._ +_This filter is available for MongoDB only in Prisma versions 5.11.1 and later._ ### In deprecation notices, mention the deprecation version number but not the planned removal version number @@ -122,12 +122,12 @@ When you explain that a feature is deprecated, include the version number in whi ```md -From v3.0.0, the `command name` command is deprecated. +From v5.0.0, the `command name` command is deprecated. -From v3.0.0, the `command name` command is deprecated. -We plan to remove `command name` in v.4.0.0. +From v5.0.0, the `command name` command is deprecated. +We plan to remove `command name` in v.6.0.0. ``` ## Abbreviate terms @@ -190,13 +190,13 @@ Use lower case for these. For "GA", the abbreviation of general availability, us ```md -We made composite types generally available in version 3.12.0. -They were previously available in preview from version 3.10.0. +We made composite types generally available in version 5.12.0. +They were previously available in preview from version 5.10.0. -We made composite types Generally Available in version 3.12.0. -They were previously available in Preview from version 3.10.0. +We made composite types Generally Available in version 5.12.0. +They were previously available in Preview from version 5.10.0. ``` ### SQL From 0dc807492cae6c5c3344862c1a4885a97f17b891 Mon Sep 17 00:00:00 2001 From: Jon Harrell <4829245+jharrell@users.noreply.github.com> Date: Mon, 24 Mar 2025 15:00:46 -0500 Subject: [PATCH 2/2] remove even more old stuff --- .../500-databases/300-postgresql.mdx | 8 ++-- .../050-overview/500-databases/500-sqlite.mdx | 2 +- .../500-databases/800-sql-server/index.mdx | 2 +- .../500-databases/840-cockroachdb.mdx | 12 +----- .../500-databases/850-planetscale.mdx | 2 +- .../10-overview/02-data-sources.mdx | 6 --- .../20-data-model/10-models.mdx | 14 ++----- .../20-relations/100-one-to-one-relations.mdx | 2 - .../20-data-model/30-indexes.mdx | 14 +------ .../20-data-model/50-database-mapping.mdx | 8 +--- .../100-prisma-schema/50-introspection.mdx | 4 -- .../100-connection-management.mdx | 6 +-- .../100-queries/030-crud.mdx | 10 +---- .../100-queries/035-select-fields.mdx | 2 +- .../100-queries/037-relation-queries.mdx | 2 +- .../100-queries/050-filtering-and-sorting.mdx | 5 +-- .../056-aggregation-grouping-summarizing.mdx | 26 ++++-------- .../150-using-raw-sql/200-raw-queries.mdx | 4 +- .../200-working-with-scalar-lists-arrays.mdx | 28 +++---------- .../140-shared-extensions.mdx | 15 ------- .../240-metrics.mdx | 2 - .../250-opentelemetry-tracing.mdx | 4 +- .../300-limitations-and-known-issues.mdx | 2 +- .../60-generating-down-migrations.mdx | 6 --- .../70-patching-and-hotfixing.mdx | 8 ---- .../050-prisma-client-reference.mdx | 41 ++++++------------- .../100-under-the-hood/100-engines.mdx | 5 +-- 27 files changed, 54 insertions(+), 186 deletions(-) diff --git a/content/200-orm/050-overview/500-databases/300-postgresql.mdx b/content/200-orm/050-overview/500-databases/300-postgresql.mdx index 664b821e70..a9985c59fc 100644 --- a/content/200-orm/050-overview/500-databases/300-postgresql.mdx +++ b/content/200-orm/050-overview/500-databases/300-postgresql.mdx @@ -161,10 +161,10 @@ The following arguments can be used: | `host` | No | | Points to a directory that contains a socket to be used for the connection | | `socket_timeout` | No | | Maximum number of seconds to wait until a single query terminates | | `pgbouncer` | No | `false` | Configure the Engine to [enable PgBouncer compatibility mode](/orm/prisma-client/setup-and-configuration/databases-connections/pgbouncer) | -| `statement_cache_size` | No | `100` | Since 2.1.0: Specifies the number of [prepared statements](#prepared-statement-caching) cached per connection | -| `application_name` | No | | Since 3.3.0: Specifies a value for the application_name configuration parameter | -| `channel_binding` | No | `prefer` | Since 4.8.0: Specifies a value for the channel_binding configuration parameter | -| `options` | No | | Since 3.8.0: Specifies command line options to send to the server at connection start | +| `statement_cache_size` | No | `100` | Specifies the number of [prepared statements](#prepared-statement-caching) cached per connection | +| `application_name` | No | | Specifies a value for the application_name configuration parameter | +| `channel_binding` | No | `prefer` | Specifies a value for the channel_binding configuration parameter | +| `options` | No | | Specifies command line options to send to the server at connection start | As an example, if you want to connect to a schema called `myschema`, set the connection pool size to `5` and configure a timeout for queries of `3` seconds. You can use the following arguments: diff --git a/content/200-orm/050-overview/500-databases/500-sqlite.mdx b/content/200-orm/050-overview/500-databases/500-sqlite.mdx index 6218a8b124..2393683418 100644 --- a/content/200-orm/050-overview/500-databases/500-sqlite.mdx +++ b/content/200-orm/050-overview/500-databases/500-sqlite.mdx @@ -65,7 +65,7 @@ When using `enum` fields in SQLite, be aware of the following: SQLite is a loosely-typed database. If your Schema has a field of type `Int`, then Prisma ORM prevents you from inserting a value larger than an integer. However, nothing prevents the database from directly accepting a bigger number. These manually-inserted big numbers cause rounding errors when queried. -To avoid this problem, Prisma ORM 4.0.0 and later checks numbers on the way out of the database to verify that they fit within the boundaries of an integer. If a number does not fit, then Prisma ORM throws a P2023 error, such as: +To avoid this problem, Prisma ORM checks numbers on the way out of the database to verify that they fit within the boundaries of an integer. If a number does not fit, then Prisma ORM throws a P2023 error, such as: ``` Inconsistent column data: Conversion failed: diff --git a/content/200-orm/050-overview/500-databases/800-sql-server/index.mdx b/content/200-orm/050-overview/500-databases/800-sql-server/index.mdx index ca31197f0f..7c765ae3e6 100644 --- a/content/200-orm/050-overview/500-databases/800-sql-server/index.mdx +++ b/content/200-orm/050-overview/500-databases/800-sql-server/index.mdx @@ -108,7 +108,7 @@ See [Supported databases](/orm/reference/supported-databases). ### Prisma Migrate caveats -Prisma Migrate is supported in [2.13.0](https://github.com/prisma/prisma/releases/tag/2.13.0) and later with the following caveats: +Prisma Migrate is supported with the following caveats: #### Database schema names diff --git a/content/200-orm/050-overview/500-databases/840-cockroachdb.mdx b/content/200-orm/050-overview/500-databases/840-cockroachdb.mdx index 846f1401d4..ac6408c4bc 100644 --- a/content/200-orm/050-overview/500-databases/840-cockroachdb.mdx +++ b/content/200-orm/050-overview/500-databases/840-cockroachdb.mdx @@ -6,18 +6,8 @@ tocDepth: 3 toc: true --- - - This guide discusses the concepts behind using Prisma ORM and CockroachDB, explains the commonalities and differences between CockroachDB and other database providers, and leads you through the process for configuring your application to integrate with CockroachDB. - - - - -The CockroachDB connector is generally available in versions `3.14.0` and later. It was first added as a [Preview feature](/orm/reference/preview-features) in version [`3.9.0`](https://github.com/prisma/prisma/releases/tag/3.9.0) with support for Introspection, and Prisma Migrate support was added in [`3.11.0`](https://github.com/prisma/prisma/releases/tag/3.11.0). - - - ## What is CockroachDB? CockroachDB is a distributed database that is designed for scalability and high availability. Features include: @@ -110,7 +100,7 @@ The fields passed to the `datasource` block are: -While `cockroachdb` and `postgresql` connectors are similar, it is mandatory to use the `cockroachdb` connector instead of `postgresql` when connecting to a CockroachDB database from version 5.0.0. +While `cockroachdb` and `postgresql` connectors are similar, it is mandatory to use the `cockroachdb` connector instead of `postgresql` when connecting to a CockroachDB database. diff --git a/content/200-orm/050-overview/500-databases/850-planetscale.mdx b/content/200-orm/050-overview/500-databases/850-planetscale.mdx index a3f9ecd398..f6c6c2a795 100644 --- a/content/200-orm/050-overview/500-databases/850-planetscale.mdx +++ b/content/200-orm/050-overview/500-databases/850-planetscale.mdx @@ -77,7 +77,7 @@ datasource db { } ``` -If you use relations in your Prisma schema with the default `"foreignKeys"` option for the `relationMode` field, PlanetScale will error and Prisma ORM output the [P3021 error message](/orm/reference/error-reference#p3021) when it tries to create foreign keys. (In versions before 2.27.0 it will output a raw database error.) +If you use relations in your Prisma schema with the default `"foreignKeys"` option for the `relationMode` field, PlanetScale will error and Prisma ORM output the [P3021 error message](/orm/reference/error-reference#p3021) when it tries to create foreign keys. #### 2. Create indexes on foreign keys diff --git a/content/200-orm/100-prisma-schema/10-overview/02-data-sources.mdx b/content/200-orm/100-prisma-schema/10-overview/02-data-sources.mdx index fc97d81577..d2fc1377ee 100644 --- a/content/200-orm/100-prisma-schema/10-overview/02-data-sources.mdx +++ b/content/200-orm/100-prisma-schema/10-overview/02-data-sources.mdx @@ -4,8 +4,6 @@ metaTitle: 'Data sources (Reference)' metaDescription: 'Data sources enable Prisma to connect to your database. This page explains how to configure data sources in your Prisma schema.' --- - - A data source determines how Prisma ORM connects your database, and is represented by the [`datasource`](/orm/reference/prisma-schema-reference#datasource) block in the Prisma schema. The following data source uses the `postgresql` provider and includes a connection URL: ```prisma @@ -20,10 +18,6 @@ A Prisma schema can only have _one_ data source. However, you can: - [Programmatically override a data source `url` when creating your `PrismaClient`](/orm/reference/prisma-client-reference#programmatically-override-a-datasource-url) - [Specify a different URL for Prisma Migrate's shadow database if you are working with cloud-hosted development databases](/orm/prisma-migrate/understanding-prisma-migrate/shadow-database#cloud-hosted-shadow-databases-must-be-created-manually) -> **Note**: Multiple provider support was removed in 2.22.0. Please see [Deprecation of provider array notation](https://github.com/prisma/prisma/issues/3834) for more information. - - - ## Securing database connections Some data source `provider`s allow you to configure your connection with SSL/TLS, and provide parameters for the `url` to specify the location of certificates. diff --git a/content/200-orm/100-prisma-schema/20-data-model/10-models.mdx b/content/200-orm/100-prisma-schema/20-data-model/10-models.mdx index f8b2711c3e..821892e885 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/10-models.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/10-models.mdx @@ -439,7 +439,7 @@ Refer to the [relations documentation](/orm/prisma-schema/data-model/relations) ### Native types mapping -Version [2.17.0](https://github.com/prisma/prisma/releases/tag/2.17.0) and later support **native database type attributes** (type attributes) that describe the underlying database type: +Prisma ORM supports **native database type attributes** (type attributes) that describe the underlying database type: ```prisma highlight=3;normal model Post { @@ -795,7 +795,7 @@ model Post { Default values can be: - Static values that correspond to the field type, such as `5` (`Int`), `Hello` (`String`), or `false` (`Boolean`) -- [Lists](/orm/reference/prisma-schema-reference#-modifier) of static values, such as `[5, 6, 8]` (`Int[]`) or `["Hello", "Goodbye"]` (`String`[]). These are available in Prisma ORM versions `4.0.0` and later, when using supported databases (PostgreSQL, CockroachDB and MongoDB) +- [Lists](/orm/reference/prisma-schema-reference#-modifier) of static values, such as `[5, 6, 8]` (`Int[]`) or `["Hello", "Goodbye"]` (`String`[]). These are available when using supported databases (PostgreSQL, CockroachDB and MongoDB) - [Functions](#using-functions), such as [`now()`](/orm/reference/prisma-schema-reference#now) or [`uuid()`](/orm/reference/prisma-schema-reference#uuid) - JSON data. Note that JSON needs to be enclosed with double-quotes inside the `@default` attribute, e.g.: `@default("[]")`. If you want to provide a JSON object, you need to enclose it with double-quotes and then escape any internal double quotes using a backslash, e.g.: `@default("{ \"hello\": \"world\" }")`. @@ -913,7 +913,7 @@ Refer to the documentation on [working with composite unique identifiers](/orm/p #### Composite type unique constraints -When using the MongoDB provider in version `3.12.0` and later, you can define a unique constraint on a field of a [composite type](#defining-composite-types) using the syntax `@@unique([compositeType.field])`. As with other fields, composite type fields can be used as part of a multi-column unique constraint. +When using the MongoDB provider you can define a unique constraint on a field of a [composite type](#defining-composite-types) using the syntax `@@unique([compositeType.field])`. As with other fields, composite type fields can be used as part of a multi-column unique constraint. The following example defines a multi-column unique constraint based on the `email` field of the `User` model and the `number` field of the `Address` composite type which is used in `User.address`: @@ -975,7 +975,7 @@ You can optionally define a [custom index name](/orm/prisma-schema/data-model/da #### Defining composite type indexes -When using the MongoDB provider in version `3.12.0` and later, you can define an index on a field of a [composite type](#defining-composite-types) using the syntax `@@index([compositeType.field])`. As with other fields, composite type fields can be used as part of a multi-column index. +When using the MongoDB provider you can define an index on a field of a [composite type](#defining-composite-types) using the syntax `@@index([compositeType.field])`. As with other fields, composite type fields can be used as part of a multi-column index. The following example defines a multi-column index based on the `email` field of the `User` model and the `number` field of the `Address` composite type: @@ -1067,12 +1067,6 @@ enum Role { ## Defining composite types - - -Composite types were added in version `3.10.0` under the `mongodb` Preview feature flag and are in General Availability since version `3.12.0`. - - - Composite types are currently only available on MongoDB. diff --git a/content/200-orm/100-prisma-schema/20-data-model/20-relations/100-one-to-one-relations.mdx b/content/200-orm/100-prisma-schema/20-data-model/20-relations/100-one-to-one-relations.mdx index 3423fed06e..6b7fe30f42 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/20-relations/100-one-to-one-relations.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/20-relations/100-one-to-one-relations.mdx @@ -190,8 +190,6 @@ model User { } ``` -This restriction was introduced in 2.12.0. - However, you can choose if the side of the relation _with_ a relation scalar should be optional or mandatory. ### Mandatory 1-1 relation diff --git a/content/200-orm/100-prisma-schema/20-data-model/30-indexes.mdx b/content/200-orm/100-prisma-schema/20-data-model/30-indexes.mdx index a098645cd0..20aa325ec4 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/30-indexes.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/30-indexes.mdx @@ -5,19 +5,9 @@ hidePage: false tocDepth: 3 --- - +Prisma ORM allows configuration of database indexes, unique constraints and primary key constraints. -Prisma ORM allows configuration of database indexes, unique constraints and primary key constraints. This is in General Availability in versions `4.0.0` and later. You can enable this with the `extendedIndexes` Preview feature in versions `3.5.0` and later. - -Version `3.6.0` also introduces support for introspection and migration of full text indexes in MySQL and MongoDB through a new `@@fulltext` attribute, available through the `fullTextIndex` Preview feature. - - - -If you are upgrading from a version earlier than 4.0.0, these changes to index configuration and full text indexes might be **breaking changes** if you have a database that already uses these features. See [Upgrading from previous versions](#upgrading-from-previous-versions) for more information on how to upgrade. - - - - +Prisma ORM has also introduced support for introspection and migration of full text indexes in MySQL and MongoDB through a new `@@fulltext` attribute, available through the `fullTextIndex` Preview feature. ## Index configuration diff --git a/content/200-orm/100-prisma-schema/20-data-model/50-database-mapping.mdx b/content/200-orm/100-prisma-schema/20-data-model/50-database-mapping.mdx index 7ace185004..fd21aa713b 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/50-database-mapping.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/50-database-mapping.mdx @@ -80,16 +80,10 @@ enum Type { ## Constraint and index names -You can optionally use the `map` argument to explicitly define the **underlying constraint and index names** in the Prisma schema for the attributes [`@id`](/orm/reference/prisma-schema-reference#id), [`@@id`](/orm/reference/prisma-schema-reference#id-1), [`@unique`](/orm/reference/prisma-schema-reference#unique), [`@@unique`](/orm/reference/prisma-schema-reference#unique-1), [`@@index`](/orm/reference/prisma-schema-reference#index) and [`@relation`](/orm/reference/prisma-schema-reference#relation). (This is available in Prisma ORM version [2.29.0](https://github.com/prisma/prisma/releases/tag/2.29.0) and later.) +You can optionally use the `map` argument to explicitly define the **underlying constraint and index names** in the Prisma schema for the attributes [`@id`](/orm/reference/prisma-schema-reference#id), [`@@id`](/orm/reference/prisma-schema-reference#id-1), [`@unique`](/orm/reference/prisma-schema-reference#unique), [`@@unique`](/orm/reference/prisma-schema-reference#unique-1), [`@@index`](/orm/reference/prisma-schema-reference#index) and [`@relation`](/orm/reference/prisma-schema-reference#relation). When introspecting a database, the `map` argument will _only_ be rendered in the schema if the name _differs_ from Prisma ORM's [default constraint naming convention for indexes and constraints](#prisma-orms-default-naming-conventions-for-indexes-and-constraints). - - -If you use Prisma Migrate in a version earlier than 2.29.0 and want to maintain your existing constraint and index names after upgrading to a newer version, **do not** immediately run `prisma migrate` or `prisma db push`. This will **change any underlying constraint name that does not follow Prisma ORM's convention**. Follow the [upgrade path that allows you to maintain existing constraint and index names](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/named-constraints#option-1-i-want-to-maintain-my-existing-constraint-and-index-names). - - - ### Use cases for named constraints Some use cases for explicitly named constraints include: diff --git a/content/200-orm/100-prisma-schema/50-introspection.mdx b/content/200-orm/100-prisma-schema/50-introspection.mdx index f3e13a73a7..29fd04cadc 100644 --- a/content/200-orm/100-prisma-schema/50-introspection.mdx +++ b/content/200-orm/100-prisma-schema/50-introspection.mdx @@ -365,19 +365,15 @@ The Prisma Schema Language (PSL) can express a majority of the database features For these features, the Prisma CLI will surface detect usage of the feature in your database and return a warning. The Prisma CLI will also add a comment in the models and fields the features are in use in the Prisma schema. The warnings will also contain a workaround suggestion. The `prisma db pull` command will surface the following unsupported features: - -- From version [4.13.0](https://github.com/prisma/prisma/releases/tag/4.13.0): - [Partitioned tables](https://github.com/prisma/prisma/issues/1708) - [PostgreSQL Row Level Security](https://github.com/prisma/prisma/issues/12735) - [Index sort order, `NULLS FIRST` / `NULLS LAST`](https://github.com/prisma/prisma/issues/15466) - [CockroachDB row-level TTL](https://github.com/prisma/prisma/issues/13982) - [Comments](https://github.com/prisma/prisma/issues/8703) - [PostgreSQL deferred constraints](https://github.com/prisma/prisma/issues/8807) -- From version [4.14.0](https://github.com/prisma/prisma/releases/tag/4.14.0): - [Check Constraints](https://github.com/prisma/prisma/issues/3388) (MySQL + PostgreSQL) - [Exclusion Constraints](https://github.com/prisma/prisma/issues/17514) - [MongoDB $jsonSchema](https://github.com/prisma/prisma/issues/8135) -- From version [4.16.0](https://github.com/prisma/prisma/releases/tag/4.16.0): - [Expression indexes](https://github.com/prisma/prisma/issues/2504) You can find the list of features we intend to support on [GitHub (labeled with `topic:database-functionality`)](https://github.com/prisma/prisma/issues?q=is%3Aopen+label%3A%22topic%3A+database-functionality%22+label%3Ateam%2Fschema+sort%3Aupdated-desc+). diff --git a/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/100-connection-management.mdx b/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/100-connection-management.mdx index 023aba982d..3ac1f3b1b0 100644 --- a/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/100-connection-management.mdx +++ b/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/100-connection-management.mdx @@ -85,11 +85,11 @@ If the above script runs multiple times in the context of a long-running applica ## Exit hooks - +:::info -From Prisma ORM 5.0.0, the `beforeExit` hook only applies to the [binary Query Engine](/orm/more/under-the-hood/engines#configuring-the-query-engine). +The `beforeExit` hook only applies to the [binary Query Engine](/orm/more/under-the-hood/engines#configuring-the-query-engine). - +::: The `beforeExit` hook runs when Prisma ORM is triggered externally (e.g. via a `SIGINT` signal) to shut down, and allows you to run code _before_ Prisma Client disconnects - for example, to issue queries as part of a graceful shutdown of a service: diff --git a/content/200-orm/200-prisma-client/100-queries/030-crud.mdx b/content/200-orm/200-prisma-client/100-queries/030-crud.mdx index 0a2b469368..2d6750a321 100644 --- a/content/200-orm/200-prisma-client/100-queries/030-crud.mdx +++ b/content/200-orm/200-prisma-client/100-queries/030-crud.mdx @@ -228,9 +228,7 @@ For more information about working with generated types, see: [Generated types]( ### Create multiple records -Prisma Client supports bulk inserts as a GA feature in [2.20.0](https://github.com/prisma/prisma/releases/2.20.0) and later. - -The following [`createMany()`](/orm/reference/prisma-client-reference#createmany) query creates multiple users and skips any duplicates (`email` must be unique): +Prisma Client supports bulk inserts. The following [`createMany()`](/orm/reference/prisma-client-reference#createmany) query creates multiple users and skips any duplicates (`email` must be unique): @@ -867,12 +865,6 @@ Be aware that this query will fail if the user has any related records (such as ### Cascading deletes (deleting related records) - - -In [2.26.0](https://github.com/prisma/prisma/releases/tag/2.26.0) and later it is possible to do cascading deletes using the **preview feature** [referential actions](/orm/prisma-schema/data-model/relations/referential-actions). - - - The following query uses [`delete()`](/orm/reference/prisma-client-reference#delete) to delete a single `User` record: ```ts diff --git a/content/200-orm/200-prisma-client/100-queries/035-select-fields.mdx b/content/200-orm/200-prisma-client/100-queries/035-select-fields.mdx index c6b290300a..cb721d7001 100644 --- a/content/200-orm/200-prisma-client/100-queries/035-select-fields.mdx +++ b/content/200-orm/200-prisma-client/100-queries/035-select-fields.mdx @@ -332,4 +332,4 @@ Notice how the returned object does _not_ contain the `password` field. ## Relation count -In [3.0.1](https://github.com/prisma/prisma/releases/3.0.1) and later, you can `include` or `select` a [count of relations](/orm/prisma-client/queries/aggregation-grouping-summarizing#count-relations) alongside fields. For example, a user's post count. +You can `include` or `select` a [count of relations](/orm/prisma-client/queries/aggregation-grouping-summarizing#count-relations) alongside fields. For example, a user's post count. diff --git a/content/200-orm/200-prisma-client/100-queries/037-relation-queries.mdx b/content/200-orm/200-prisma-client/100-queries/037-relation-queries.mdx index fc9507e794..91bad3e3bb 100644 --- a/content/200-orm/200-prisma-client/100-queries/037-relation-queries.mdx +++ b/content/200-orm/200-prisma-client/100-queries/037-relation-queries.mdx @@ -381,7 +381,7 @@ const user = await prisma.user.findFirst({ ## Relation count -In [3.0.1](https://github.com/prisma/prisma/releases/3.0.1) and later, you can [`include` or `select` a count of relations](/orm/prisma-client/queries/aggregation-grouping-summarizing#count-relations) alongside fields - for example, a user's post count. +You can [`include` or `select` a count of relations](/orm/prisma-client/queries/aggregation-grouping-summarizing#count-relations) alongside fields - for example, a user's post count. diff --git a/content/200-orm/200-prisma-client/100-queries/050-filtering-and-sorting.mdx b/content/200-orm/200-prisma-client/100-queries/050-filtering-and-sorting.mdx index 813f6605b6..32c6e70ad7 100644 --- a/content/200-orm/200-prisma-client/100-queries/050-filtering-and-sorting.mdx +++ b/content/200-orm/200-prisma-client/100-queries/050-filtering-and-sorting.mdx @@ -367,7 +367,7 @@ const posts = await prisma.post.findMany({ ### Sort by relation aggregate value -In [2.19.0](https://github.com/prisma/prisma/releases/2.19.0) and later, you can sort by the **count of related records**. +You can sort by the **count of related records**. For example, the following query sorts users by the number of related posts: @@ -386,7 +386,7 @@ const getActiveUsers = await prisma.user.findMany({ ### Sort by relevance (PostgreSQL and MySQL) -In [3.5.0+](https://github.com/prisma/prisma/releases/3.5.0) for PostgreSQL and [3.8.0+](https://github.com/prisma/prisma/releases/3.8.0) for MySQL, you can sort records by relevance to the query using the `_relevance` keyword. This uses the relevance ranking functions from full text search features. +You can sort records by relevance to the query using the `_relevance` keyword. This uses the relevance ranking functions from full text search features. This feature is further explain in [the PostgreSQL documentation](https://www.postgresql.org/docs/12/textsearch-controls.html) and [the MySQL documentation](https://dev.mysql.com/doc/refman/8.0/en/fulltext-search.html). @@ -431,7 +431,6 @@ Prior to Prisma ORM 5.16.0, enabling the `fullTextSearch` preview feature would Notes: -- This feature is generally available in version `4.16.0` and later. To use this feature in versions [`4.1.0`](https://github.com/prisma/prisma/releases/tag/4.1.0) to [`4.15.0`](https://github.com/prisma/prisma/releases/tag/4.15.0) the [Preview feature](/orm/reference/preview-features/client-preview-features#enabling-a-prisma-client-preview-feature) `orderByNulls` will need to be enabled. - This feature is not available for MongoDB. - You can only sort by nulls on optional [scalar](/orm/prisma-schema/data-model/models#scalar-fields) fields. If you try to sort by nulls on a required or [relation](/orm/prisma-schema/data-model/models#relation-fields) field, Prisma Client throws a [P2009 error](/orm/reference/error-reference#p2009). diff --git a/content/200-orm/200-prisma-client/100-queries/056-aggregation-grouping-summarizing.mdx b/content/200-orm/200-prisma-client/100-queries/056-aggregation-grouping-summarizing.mdx index 5461812f40..645346657f 100644 --- a/content/200-orm/200-prisma-client/100-queries/056-aggregation-grouping-summarizing.mdx +++ b/content/200-orm/200-prisma-client/100-queries/056-aggregation-grouping-summarizing.mdx @@ -53,7 +53,7 @@ console.log('Average age:' + aggregations._avg.age) ### Aggregate values are nullable -In [2.21.0](https://github.com/prisma/prisma/releases/tag/2.21.0) and later, aggregations on **nullable fields** can return a `number` or `null`. This excludes `count`, which always returns 0 if no records are found. +Aggregations on **nullable fields** can return a `number` or `null`. This excludes `count`, which always returns 0 if no records are found. Consider the following query, where `age` is nullable in the schema: @@ -97,7 +97,7 @@ This allows you to differentiate between the true aggregate value (which could b ## Group by -Prisma Client's [`groupBy()`](/orm/reference/prisma-client-reference#groupby) allows you to **group records** by one or more field values - such as `country`, or `country` and `city` and **perform aggregations** on each group, such as finding the average age of people living in a particular city. `groupBy()` is a GA in [2.20.0](https://github.com/prisma/prisma/releases/2.20.0) and later. +Prisma Client's [`groupBy()`](/orm/reference/prisma-client-reference#groupby) allows you to **group records** by one or more field values - such as `country`, or `country` and `city` and **perform aggregations** on each group, such as finding the average age of people living in a particular city. The following video uses `groupBy()` to summarize total COVID-19 cases by continent: @@ -265,13 +265,13 @@ const groupUsers = await prisma.user.groupBy({ The following constraints apply when you combine `groupBy()` and `orderBy`: -- You can `orderBy` fields that are present in `by` -- You can `orderBy` aggregate (Preview in 2.21.0 and later) -- If you use `skip` and/or `take` with `groupBy()`, you must also include `orderBy` in the query +- You can `orderBy` fields that are present in `by`. +- You can `orderBy` aggregates. +- If you use `skip` and/or `take` with `groupBy()`, you must also include `orderBy` in the query. #### Order by aggregate group -You can **order by aggregate group**. Prisma ORM added support for using `orderBy` with aggregated groups in relational databases in version [2.21.0](https://github.com/prisma/prisma/releases/2.21.0) and support for MongoDB in [3.4.0](https://github.com/prisma/prisma/releases/3.4.0). +You can **order by aggregate group**. The following example sorts each `city` group by the number of users in that group (largest group first): @@ -350,12 +350,6 @@ const userCount = await prisma.user.count() ### Count relations - - -This feature is generally available in version [3.0.1](https://github.com/prisma/prisma/releases/3.0.1) and later. To use this feature in versions before 3.0.1 the [Preview feature](/orm/reference/preview-features/client-preview-features#enabling-a-prisma-client-preview-feature) `selectRelationCount` will need to be enabled. - - - To return a count of relations (for example, a user's post count), use the `_count` parameter with a nested `select` as shown: @@ -491,12 +485,6 @@ const usersWithCount = await prisma.user.findMany({ #### Filter the relation count - - -This feature is generally available in version `4.16.0` and later. To use this feature in versions [`4.3.0`](https://github.com/prisma/prisma/releases/tag/4.3.0) to [`4.15.0`](https://github.com/prisma/prisma/releases/tag/4.15.0) the [Preview feature](/orm/reference/preview-features/client-preview-features#enabling-a-prisma-client-preview-feature) `filteredRelationCount` will need to be enabled. - - - Use `where` to filter the fields returned by the `_count` output type. You can do this on [scalar fields](/orm/prisma-schema/data-model/models#scalar-fields), [relation fields](/orm/prisma-schema/data-model/models#relation-fields) and fields of a [composite type](/orm/prisma-schema/data-model/models#defining-composite-types). For example, the following query returns all user posts with the title "Hello!": @@ -534,7 +522,7 @@ await prisma.user.findMany({ ### Count non-`null` field values -In [2.15.0](https://github.com/prisma/prisma/releases/2.15.0) and later, you can count all records as well as all instances of non-`null` field values. The following query returns a count of: +You can count all records as well as all instances of non-`null` field values. The following query returns a count of: - All `User` records (`_all`) - All non-`null` `name` values (not distinct values, just values that are not `null`) diff --git a/content/200-orm/200-prisma-client/150-using-raw-sql/200-raw-queries.mdx b/content/200-orm/200-prisma-client/150-using-raw-sql/200-raw-queries.mdx index f166418d7e..8f7506bffc 100644 --- a/content/200-orm/200-prisma-client/150-using-raw-sql/200-raw-queries.mdx +++ b/content/200-orm/200-prisma-client/150-using-raw-sql/200-raw-queries.mdx @@ -17,7 +17,7 @@ Prisma Client supports the option of sending raw queries to your database. You m - you want to run a heavily optimized query - you require a feature that Prisma Client does not yet support (please [consider raising an issue](https://github.com/prisma/prisma/issues/new/choose)) -Raw queries are available for all relational databases Prisma ORM supports. In addition, from version `3.9.0` raw queries are supported in MongoDB. For more details, see the relevant sections: +Raw queries are available for all databases Prisma ORM supports. - [Raw queries with relational databases](#raw-queries-with-relational-databases) - [Raw queries with MongoDB](#raw-queries-with-mongodb) @@ -717,7 +717,7 @@ const result = await prisma.$queryRawUnsafe( ## Raw queries with MongoDB -For MongoDB in versions `3.9.0` and later, Prisma Client exposes three methods that allow you to send raw queries. You can use: +For MongoDB, Prisma Client exposes three methods that allow you to send raw queries. You can use: - `$runCommandRaw` to run a command against the database - `.findRaw` to find zero or more documents that match the filter. diff --git a/content/200-orm/200-prisma-client/200-special-fields-and-types/200-working-with-scalar-lists-arrays.mdx b/content/200-orm/200-prisma-client/200-special-fields-and-types/200-working-with-scalar-lists-arrays.mdx index 6682d03c9d..978aa45116 100644 --- a/content/200-orm/200-prisma-client/200-special-fields-and-types/200-working-with-scalar-lists-arrays.mdx +++ b/content/200-orm/200-prisma-client/200-special-fields-and-types/200-working-with-scalar-lists-arrays.mdx @@ -59,13 +59,6 @@ const createdUser = await prisma.user.create({ ## Unsetting the value of a scalar list - - -This method is available on MongoDB only in versions -[3.11.1](https://github.com/prisma/prisma/releases/tag/3.11.1) and later. - - - The following example demonstrates how to [`unset`](/orm/reference/prisma-client-reference#unset) the value of a scalar list (`coinflips`): ```ts @@ -83,15 +76,11 @@ Unlike `set: null`, `unset` removes the list entirely. ## Adding items to a scalar list - - -Available for: +:::warning -- PostgreSQL in versions [2.15.0](https://github.com/prisma/prisma/releases/tag/2.15.0) and later -- CockroachDB in versions [3.9.0](https://github.com/prisma/prisma/releases/tag/3.9.0) and later -- MongoDB in versions [3.11.0](https://github.com/prisma/prisma/releases/tag/3.11.0) and later +Available for: PostgreSQL, CockroachDB, and MongoDB. - +::: Use the [`push`](/orm/reference/prisma-client-reference#push) method to add a single value to a scalar list: @@ -139,11 +128,7 @@ if (user) { -Available for: - -- PostgreSQL in versions [2.15.0](https://github.com/prisma/prisma/releases/tag/2.15.0) and later -- CockroachDB in versions [3.9.0](https://github.com/prisma/prisma/releases/tag/3.9.0) and later -- MongoDB in versions [3.11.0](https://github.com/prisma/prisma/releases/tag/3.11.0) and later +Available for PostgreSQL, CockroachDB, and MongoDB. @@ -163,10 +148,7 @@ const posts = await prisma.post.findMany({ -This section applies to: - -- PostgreSQL in versions [2.15.0](https://github.com/prisma/prisma/releases/tag/2.15.0) and later -- CockroachDB in versions [3.9.0](https://github.com/prisma/prisma/releases/tag/3.9.0) and later +This information applies to PostgreSQL and CockroachDB. diff --git a/content/200-orm/200-prisma-client/300-client-extensions/140-shared-extensions.mdx b/content/200-orm/200-prisma-client/300-client-extensions/140-shared-extensions.mdx index 88922a36dc..6ee74b07ea 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/140-shared-extensions.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/140-shared-extensions.mdx @@ -80,21 +80,6 @@ Refer to the following pages to learn the different ways you can modify Prisma C - [Modify a specific operation in all models of your schema](/orm/prisma-client/client-extensions/query#modify-a-specific-operation-in-all-models-of-your-schema) - [Modify all operations in all models of your schema](/orm/prisma-client/client-extensions/query#modify-all-operations-in-all-models-of-your-schema) -
- For versions earlier than 4.16.0 - -The `Prisma` import is available from a different path shown in the snippet below: - -```ts -import { Prisma } from '@prisma/client/scripts/default-index' - -export default Prisma.defineExtension({ - name: 'prisma-extension-', -}) -``` - -
- ### Publishing the shareable extension to npm You can then share the extension on `npm`. When you choose a package name, we recommend that you use the `prisma-extension-` convention, to make it easier to find and install. diff --git a/content/200-orm/200-prisma-client/600-observability-and-logging/240-metrics.mdx b/content/200-orm/200-prisma-client/600-observability-and-logging/240-metrics.mdx index 27db92374b..87d8be0888 100644 --- a/content/200-orm/200-prisma-client/600-observability-and-logging/240-metrics.mdx +++ b/content/200-orm/200-prisma-client/600-observability-and-logging/240-metrics.mdx @@ -57,8 +57,6 @@ To use Prisma Client metrics, you must do the following: ### 1. Install up-to-date Prisma ORM dependencies -Use version `3.15.0` or higher of the `prisma` and `@prisma/client` npm packages. - ```terminal npm install prisma@latest --save-dev npm install @prisma/client@latest --save diff --git a/content/200-orm/200-prisma-client/600-observability-and-logging/250-opentelemetry-tracing.mdx b/content/200-orm/200-prisma-client/600-observability-and-logging/250-opentelemetry-tracing.mdx index fb1a954c10..457c166092 100644 --- a/content/200-orm/200-prisma-client/600-observability-and-logging/250-opentelemetry-tracing.mdx +++ b/content/200-orm/200-prisma-client/600-observability-and-logging/250-opentelemetry-tracing.mdx @@ -80,7 +80,7 @@ This section explains how to install and register tracing in your application. ### Step 1. Install up-to-date Prisma ORM dependencies -Use version `6.1.0` or later of the `prisma`, `@prisma/client`, and `@prisma/instrumentation` npm packages. You will also need to install the `@opentelemetry/api` package as it's a peer dependency. +Use the latest versions of the `prisma`, `@prisma/client`, and `@prisma/instrumentation` npm packages. You will also need to install the `@opentelemetry/api` package as it's a peer dependency. ```terminal npm install prisma@latest --save-dev @@ -92,7 +92,7 @@ npm install @opentelemetry/api@latest --save
Tracing on previous versions of Prisma ORM -Tracing was added in version `4.2.0` of Prisma ORM as a Preview feature. For versions of Prisma ORM between `4.2.0` and `6.1.0`, you need to enable the `tracing` Preview feature in your Prisma schema file. +For versions before Prisma ORM 6.1.0, you will also need to enable the `tracing` Preview feature in your Prisma schema file. ```prisma generator client { diff --git a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/300-limitations-and-known-issues.mdx b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/300-limitations-and-known-issues.mdx index 49be07a481..be2d76cc27 100644 --- a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/300-limitations-and-known-issues.mdx +++ b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/300-limitations-and-known-issues.mdx @@ -18,7 +18,7 @@ Prisma Migrate does not currently support the MongoDB connector. Prisma Migrate generates SQL files that are specific to your provider. This means that you cannot use the same migration files for PostgreSQL in production and SQLite in development, because the syntax in the migrations will be incompatible. -In [2.15.0](https://github.com/prisma/prisma/releases/2.15.0) and later, Prisma Migrate detects when the migrations do not match the configured provider and prints a helpful error message. For example, if your migrations are for a PostgreSQL database but you are using a `provider` is set to `mysql`: +Prisma Migrate detects when the migrations do not match the configured provider and prints a helpful error message. For example, if your migrations are for a PostgreSQL database but you are using a `provider` is set to `mysql`: ``` Error: P3014 diff --git a/content/200-orm/300-prisma-migrate/300-workflows/60-generating-down-migrations.mdx b/content/200-orm/300-prisma-migrate/300-workflows/60-generating-down-migrations.mdx index 5f20a17429..509c924948 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/60-generating-down-migrations.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/60-generating-down-migrations.mdx @@ -23,12 +23,6 @@ This guide applies to generating SQL down migrations for relational databases on - - -The `migrate diff` and `db execute` commands are available in Preview in versions `3.9.0` and later, and are generally available in versions `3.13.0` and later. - - - ## Considerations when generating down migrations When generating a down migration file, there are some considerations to be aware of: diff --git a/content/200-orm/300-prisma-migrate/300-workflows/70-patching-and-hotfixing.mdx b/content/200-orm/300-prisma-migrate/300-workflows/70-patching-and-hotfixing.mdx index 9f8a5addad..b849aaaf0c 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/70-patching-and-hotfixing.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/70-patching-and-hotfixing.mdx @@ -128,8 +128,6 @@ To help with fixing a failed migration, Prisma ORM provides the following comman - [`prisma migrate diff`](/orm/reference/prisma-cli-reference#migrate-diff) which diffs two database schema sources to create a migration taking one to the state of the second. You can output either a summary of the difference or a sql script. The script can be output into a file via `> file_name.sql` or be piped to the `db execute --stdin` command. - [`prisma db execute`](/orm/reference/prisma-cli-reference#db-execute) which applies a SQL script to the database without interacting with the Prisma migrations table. -These commands are available in Preview in versions `3.9.0` and later (with the `--preview-feature` CLI flag), and generally available in versions `3.13.0` and later. - This section gives an example scenario of a failed migration, and explains how to use `migrate diff` and `db execute` to fix it. ### Example of a failed migration @@ -252,12 +250,6 @@ Your local migration history now yields the same result as the state your produc ## Migration history conflicts - - -This does not apply from version [3.12.0](https://github.com/prisma/prisma/releases/tag/3.12.0) upwards. - - - `prisma migrate deploy` issues a warning if an already applied migration has been edited - however, it does not stop the migration process. To remove the warnings, restore the original migration from source control. ## Prisma Migrate and PgBouncer diff --git a/content/200-orm/500-reference/050-prisma-client-reference.mdx b/content/200-orm/500-reference/050-prisma-client-reference.mdx index 494a6c1ec8..95043ea7d9 100644 --- a/content/200-orm/500-reference/050-prisma-client-reference.mdx +++ b/content/200-orm/500-reference/050-prisma-client-reference.mdx @@ -1674,7 +1674,7 @@ See: [Using Raw SQL (`aggregateRaw()`)](/orm/prisma-client/using-raw-sql/raw-que #### Remarks - You cannot combine `select` and `include` on the same level. -- In [3.0.1](https://github.com/prisma/prisma/releases/3.0.1) and later, you can [select a `_count` of relations](#select-a-_count-of-relations). +- You can [select a `_count` of relations](#select-a-_count-of-relations). #### Examples @@ -1892,7 +1892,7 @@ const selectNameEmailNotPosts = Prisma.validator()({ #### Remarks -- In [3.0.1](https://github.com/prisma/prisma/releases/3.0.1) and later, you can [`include` a `_count` of relations](#include-a-_count-of-relations) +- You can [`include` a `_count` of relations](#include-a-_count-of-relations) #### Examples @@ -2245,11 +2245,9 @@ Sorts a list of records. See also: [Sorting](/orm/prisma-client/queries/filterin #### Remarks -- In [2.16.0](https://github.com/prisma/prisma/releases/2.16.0) and later, you can [order by relation fields](#sort-post-by-the-related-user-records-name) - for example, order posts by the author's name. - -- In [3.5.0](https://github.com/prisma/prisma/releases/3.5.0) and later, in PostgreSQL you can [order by relevance](#sort-post-by-relevance-of-the-title). For details, see [Sort by relevance](/orm/prisma-client/queries/filtering-and-sorting#sort-by-relevance-postgresql-and-mysql). - -- In [4.1.0](https://github.com/prisma/prisma/releases/4.1.0) and later, you can [sort `null` records first or last](#sort-post-by-the-related-user-records-name-with-null-records-first). For details, see [Sort with nulls first or last](/orm/prisma-client/queries/filtering-and-sorting#sort-with-null-records-first-or-last). +- You can [order by relation fields](#sort-post-by-the-related-user-records-name) - for example, order posts by the author's name. +- With PostgreSQL you can [order by relevance](#sort-post-by-relevance-of-the-title). For details, see [Sort by relevance](/orm/prisma-client/queries/filtering-and-sorting#sort-by-relevance-postgresql-and-mysql). +- You can [sort `null` records first or last](#sort-post-by-the-related-user-records-name-with-null-records-first). For details, see [Sort with nulls first or last](/orm/prisma-client/queries/filtering-and-sorting#sort-with-null-records-first-or-last). #### Inputs for `sort` argument @@ -3081,7 +3079,7 @@ const user = await prisma.profile.create({ }); ``` -In [2.11.0](https://github.com/prisma/prisma/releases/2.11.0) and later, you can set the foreign key directly: +You can also set the foreign key directly: ```ts const user = await prisma.profile.create({ @@ -3306,14 +3304,7 @@ A nested `disconnect` query breaks the connection between a parent record and a #### Remarks - `disconnect` is only available if the relation is optional. -- If the relationship you are attempting to disconnect does not exist: - - - ([In 2.21.0 and later](https://github.com/prisma/prisma/releases/tag/2.21.0)), the operation does nothing - - (Before [2.21.0](https://github.com/prisma/prisma/releases/tag/2.21.0)) Prisma Client throws an exception if the provided ID or unique identifier is not connected: - - ``` - The records for relation `PostToUser` between the `User` and `Post` models are not connected. - ``` +- If the relationship you are attempting to disconnect does not exist, the operation does nothing. #### Examples @@ -4314,7 +4305,7 @@ const setTags = await prisma.post.update({ ### `push` -`push` is available in version [2.20.0](https://github.com/prisma/prisma/releases/2.20.0) and later. Use `push` to add _one_ value or _multiple_ values to a scalar list field. +Use `push` to add _one_ value or _multiple_ values to a scalar list field. #### Remarks @@ -4355,8 +4346,7 @@ const addTag = await prisma.post.update({ -This method is available on MongoDB only in versions -[3.11.1](https://github.com/prisma/prisma/releases/tag/3.11.1) and later. +This method is only available on MongoDB. @@ -4385,11 +4375,7 @@ Scalar list filters allow you to filter by the contents of a list / array field. -Available for: - -- PostgreSQL in versions [2.15.0](https://github.com/prisma/prisma/releases/tag/2.15.0) and later -- CockroachDB in versions [3.9.0](https://github.com/prisma/prisma/releases/tag/3.9.0) and later -- MongoDB in versions [3.11.0](https://github.com/prisma/prisma/releases/tag/3.11.0) and later +Available for PostgreSQL, CockroachDB, and MongoDB. @@ -4487,8 +4473,7 @@ const posts = await prisma.post.findMany({ -This filter is available on MongoDB only in versions -[3.11.1](https://github.com/prisma/prisma/releases/tag/3.11.1) and later. +This filter is only available on MongoDB. @@ -4530,7 +4515,7 @@ const posts = await prisma.post.findMany({ -Available for MongoDB only in Prisma `3.10.0` and later. +Available for MongoDB only. @@ -4699,7 +4684,7 @@ const product = prisma.product.update({ -Available for MongoDB only in Prisma `3.11.0` and later. +Available for MongoDB only. diff --git a/content/200-orm/800-more/100-under-the-hood/100-engines.mdx b/content/200-orm/800-more/100-under-the-hood/100-engines.mdx index dcf39716e6..da6ecf76cc 100644 --- a/content/200-orm/800-more/100-under-the-hood/100-engines.mdx +++ b/content/200-orm/800-more/100-under-the-hood/100-engines.mdx @@ -42,13 +42,10 @@ Use the following environment variables to specify custom locations for your bin - [`PRISMA_QUERY_ENGINE_BINARY`](/orm/reference/environment-variables-reference#prisma_query_engine_binary) (Query engine, binary) - [`PRISMA_SCHEMA_ENGINE_BINARY`](/orm/reference/environment-variables-reference#prisma_schema_engine_binary) (Schema engine) - [`PRISMA_MIGRATION_ENGINE_BINARY`](/orm/reference/environment-variables-reference#prisma_migration_engine_binary) (Migration engine) -- [`PRISMA_INTROSPECTION_ENGINE_BINARY`](/orm/reference/environment-variables-reference#prisma_introspection_engine_binary) (Introspection engine) -- `PRISMA_MIGRATION_ENGINE_BINARY` variable is deprecated in [5.0.0](https://github.com/prisma/prisma/releases/tag/5.0.0). -- The Introspection Engine is served by the Migration Engine from [4.9.0](https://github.com/prisma/prisma/releases/tag/4.9.0). Therefore, the `PRISMA_INTROSPECTION_ENGINE` environment variable will not be used. -- The `PRISMA_FMT_BINARY` variable is used in versions [4.2.0](https://github.com/prisma/prisma/releases/tag/4.2.0) or lower. +The `PRISMA_MIGRATION_ENGINE_BINARY` variable is deprecated in [5.0.0](https://github.com/prisma/prisma/releases/tag/5.0.0).