Publicado en

Nestjs aplicación de matricula a curso – Parte I

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!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *