rembrembdocs

Data Model

How to support database features that do not have an equivalent syntax in Prisma Schema Language

Not all database functions and features of Prisma ORM's supported databases have a Prisma Schema Language equivalent. Refer to the database features matrix for a complete list of supported features.

Prisma Schema Language supports several functions that you can use to set the default value of a field. The following example uses the Prisma ORM-level uuid() function to set the value of the id field:

model Post {
  id String @id @default(uuid())
}

However, you can also use native database functions to define default values with dbgenerated(...) on relational databases (MongoDB does not have the concept of database-level functions). The following example uses the PostgreSQL gen_random_uuid() function to populate the id field:

model User {
  id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
}

When to use a database-level function

There are two reasons to use a database-level function:

Enable PostgreSQL extensions for native database functions

In PostgreSQL, some native database functions are part of an extension. For example, in PostgreSQL versions 12.13 and earlier, the gen_random_uuid() function is part of the pgcrypto extension.

To use a PostgreSQL extension, you must first install it on the file system of your database server.

You can then activate the extension by installing it via a customized migration. Add the following SQL to your migration file:

CREATE EXTENSION IF NOT EXISTS pgcrypto;

If your project uses Prisma Migrate, you must install the extension as part of a migration . Do not install the extension manually, because it is also required by the shadow database.

Prisma Migrate returns the following error if the extension is not available:

Migration `20210221102106_failed_migration` failed to apply cleanly to a temporary database.
Database error: Error querying the database: db error: ERROR: type "pgcrypto" does not exist

Some database types of relational databases, such as polygon or geometry, do not have a Prisma Schema Language equivalent. Use the Unsupported field type to represent the field in your Prisma schema:

model Star {
  id       Int                    @id @default(autoincrement())
  position Unsupported("circle")? @default(dbgenerated("'<(10,4),11>'::circle")) 
}

The prisma migrate dev and prisma db push command will both create a position field of type circle in the database. However, the field will not be available in the generated Prisma Client.

Some features, like SQL views, cannot be represented in the Prisma schema. If your project uses Prisma Migrate, you must include unsupported features as part of a migration .