Prisma

By Tomás Hernández, Posted on January 7, 2024 (8mo ago)

⚠️

Este artículo está incompleto y puede contener errores.

Comandos Útiles

  1. yarn add -D prisma
  2. yarn add @prisma/client
  3. npx prisma init -> Crea la carpeta de prisma en el root del proyecto
  4. npx prisma format -> Nos dice los posibles errores y los corrige en caso de ser posible.
  5. npx prisma generate
  6. npx prisma db push

Inicializar la DB y usar Prisma

Usar los comandos 1 y 2.

Configurar las .env

Debe de existir una variable que sea DATABASE_URL, normalmente es de la forma "POSTGRESQL://user:password@host/database?params"

Generar el archivo de schema.prisma

Usar el comando 3.

Configurar el archivo de schema.prisma

Elegir el provider a utilizar "mysql" | "postgres" ...

Ejemplo de archivo de Prisma

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

generator client {
  provider = "prisma-client-js"
}

model User {
  id String @id @default(cuid())
  name String
  email String @unique
  emailVerified DateTime?
  image String?
  accounts Account[]
  createdAt DateTime @default(now())
}

model Account {
  id                 String    @id @default(cuid())
  userId             String    @unique
  providerType       String
  providerId         String
  providerAccountId  String
  refreshToken       String?
  accessToken        String?
  accessTokenExpires DateTime?
  createdAt          DateTime  @default(now())
  updatedAt          DateTime  @updatedAt
  user               User      @relation(fields: [userId], references: [id])

  @@unique([providerId, providerAccountId])
}

Preparar el Schema y subirlo a la base de datos

Usar los comandos 4, 5 y 6.

Solucionar error "foreign key constraints are not allowed"

Esto suele suceder si estás utilizando PlanetScale. Para poder solucionarlo, hay que agregar 'relationMode = "prisma"' al objeto de datasource db, es decir, quedaría algo así:

    datasource db {
        provider = "mysql"
        url      = env("DATABASE_URL")
        relationMode = "prisma"
    }

"PlanetScale does not allow foreign keys in its database schema. By default, Prisma uses foreign keys in the underlying database to enforce relations between fields in your Prisma schema. In Prisma versions 3.1.1 and later, you can emulate relations in Prisma Client with the prisma relation mode, which avoids the need for foreign keys in the database.

To enable emulation of relations in Prisma Client, set the relationMode field to "prisma" in the datasource block" Fuente: https://www.prisma.io/docs/orm/overview/databases/planetscale#differences-to-consider

Entonces, para poder dejar bien armado el modelo con Foreign Keys hay que crear los índices manualmente colocando @unique.

Solucionar error PrismaClientInitializationError

Colocar en el objeto de scripts en package.json el siguiente script: "postinstall": "prisma generate"

De manera que debería quedar algo así:

    "scripts": {
        ...otros_scripts,
        "postinstall": "prisma generate"
    },