Es necesario crear el proyecto.
nest new matricula-app

Luego vamos a utilizar Prisma para gestionar los datos.
En caso de no tener prisma es necesario instalarlo con npm
npm install prisma @prisma/client

Tenemos que estar dentro de la carpeta del proyecto para poder ejecutar el comando de prisma npx.
Vamos a definir el proveedor de base de datos que utilizare, para este ejercicio será sqlite.
npx prisma init --datasource-provider sqlite

Tenemos que editar el archivo de prisma/schema.prisma del proyecto con la estructura de datos a trabajar.
Se presenta la definición de tablas solo con campos sencillos, sin relaciones aún
model Alumno {
id Int @id @default(autoincrement())
nombre String
apellido String
dni String @unique
email String @unique
createdAt Datetime @default(now())
}
model Docente {
id Int @id @default(autoincrement())
nombre String
apellido String
dni String @unique
email String @unique
}
model Curso {
id Int @id @default(autoincrement())
nombre String
codigo String @unique
creditos Int
}
model Matricula {
id Int @id @default(autoincrement())
fecha Datetime @default(now())
estado String @default("ACTIVO")
}
Ahora vamos a establecer las FK y relaciones 1:n y n:1 con comentarios.
model Alumno {
id Int @id @default(autoincrement())
nombre String
apellido String
dni String @unique
email String @unique
createdAt DateTime @default(now())
matriculas Matricula[] // Relación 1:N — un alumno puede tener múltiples matrículas
}
model Docente {
id Int @id @default(autoincrement())
nombre String
apellido String
dni String @unique
email String @unique
cursos Curso[] // Relación 1:N — un docente puede dictar múltiples cursos
}
model Curso {
id Int @id @default(autoincrement())
nombre String
codigo String @unique // Código único del curso, ej: MAT101
creditos Int
docenteId Int // FK → Docente (responsable del curso)
docente Docente @relation(fields: [docenteId], references: [id]) // Relación N:1 — muchos cursos pueden tener un docente
matriculas Matricula[] // Relación 1:N — un curso puede tener múltiples alumnos matriculados
}
model Matricula {
id Int @id @default(autoincrement())
alumnoId Int // FK → Alumno
cursoId Int // FK → Curso
fecha DateTime @default(now())
estado String @default("ACTIVO") // Estados posibles: ACTIVO | RETIRADO | APROBADO
alumno Alumno @relation(fields: [alumnoId], references: [id]) // Relación N:1 — muchas matrículas pertenecen a un alumno
curso Curso @relation(fields: [cursoId], references: [id]) // Relación N:1 — muchas matrículas pertenecen a un curso
@@unique([alumnoId, cursoId]) // Restricción: un alumno no puede matricularse dos veces al mismo curso
}
Luego hay que ejecutar la migracion
npx prisma migrate dev --name init

Migración realizada se creo el archivo de base de datos sqlite -> dev.db
El nombre del archivo se definió en la DATABASE_URL del archivo .env, también vemos que ya se creo.
Nota: Prisma 7 ya trae instalado el dotenv, asi que no es necesario instalarlo directamente.

- Se creó el archivo dev.db
- Se creó la migración como historial de cambios prisma/migrations/20260607033831_init/migration.sql
- Las 4 tablas han sido creadas.
Lo siguiente es generar el cliente de prisma con:
npx prisma generate

Ahora si necesitamos empezar a crear los recursos (resources) -> module, service, controller, DTOs y entities
Se va a utilizar el comando resource para crear todo.
g = generate
nest g resource alumno
nest g resource docente
nest g resource curso
nest g resource matricula
Hara unas preguntas, responder con
- What transport layer do you use? >> REST API
- Would you like to generate CRUD entry points? >> Yes

Se genera todo.

Replicar para cada entidad / tabla.
Instalar adapter para integrar prisma con nestjs y lograr consultas a sqlite
npm install @prisma/adapter-better-sqlite3
npm install better-sqlite3
npm install --save-dev @types/better-sqlite3

Luego tenemos que crear un archivo de module y service para prisma.
nest generate module prisma
nest generate service prisma
cada uno de estos archivos hay que editarlos.
prisma/prisma.service.ts
import { Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '../../generated/prisma/client';
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
constructor(){
const adapter = new PrismaBetterSqlite3({ url: 'file:./dev.db' });
super({adapter})
}
async onModuleInit() {
await this.$connect();
}
}
luego el archivo del module.
prisma/module.ts
import { Global, Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';
@Global()
@Module({
providers: [PrismaService],
exports: [PrismaService]
})
export class PrismaModule {}
y también asegurarnos que el module este importando a nivel de la app.module.ts
Si utilizaron los generadores el module se importara solo.

Luego hay que corregir un error de conflicto en las configuraciones de prisma por formato.
prisma/schema.prisma (Donde se definieron las tablas) hay que aclarar el formato del modulo (moduleFormat) como «cjs»
generator client {
provider = "prisma-client"
output = "../generated/prisma"
moduleFormat = "cjs"
}
datasource db {
provider = "sqlite"
}
luego ejecutar un npx prisma generate
npx prisma generate
Finalmente, ejecutar el proyecto para validar que todo esta funcionando.
npm run start:dev
Parte II – Visitar
Prisma.io – Enlace
¡Saludos!