Nest JS y Prisma ORM: Crea tu seeder de base de datos
Published: 2023-10-20 22:42:26

En el tiempo que llevo trabando como backend, me he encontrado con la necesidad de insertar información en la base de datos y estoy seguro de que muchos de ustedes también se han visto en esta situación. La forma tradicional es agregar dicha data manualmente (insert into... etc) pero hay una forma en la que nos podemos ahorrar mucho tiempo creando scripts que nos permitan insertar la información que necesitemos con solo ejecutar un comando, en este artículo te explico cómo hacerlo.
<br>
## Creación del proyecto
<br>
Como primer paso, crearemos el proyecto Nest e integraremos Prisma, si deseas conocer más detalles puedes ir a la [documentación oficial](https://docs.nestjs.com/recipes/prisma) de Nest donde explican como integrar prisma.
```bash
$ nest new nestjs-prisma-seeder-example
$ pnpm install prisma --save-dev
$ pnpm exec prisma init
$ pnpm i @prisma/client
```
<br>
Yo estoy utilizando pnpm, pero puedes usar npm o yarn, en el caso de npm los comandos serian los siguientes:
```bash
$ nest new nestjs-prisma-seeder-example
$ npm install prisma --save-dev
$ npx prisma init
$ npm i @prisma/client
```
<br>
Recuerda crear la base de datos y configurar el archivo .env para que apunte a la misma. En mi caso, usaré Postgresql como gestor de base de datos, de igual forma puedes usarlo con Mysql y SqlServer, personalmente también he usado SqlServer y funciona perfectamente.
<br>
## Creación de las tablas
<br>
El siguiente paso es crear las tablas, yo utilizaré una sola, llamada **car**. Primero nos vamos a nuestro archivo schema.prisma dentro de la carpeta prisma y definimos el modelo: 
```code
generator client {
  provider = "prisma-client-js"
}

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

model car {
  id   Int    @id @default(autoincrement())
  name String @db.VarChar(1024)
  color String @db.VarChar(1024)
}
```
<br>
Y luego ejecutamos la migración para que se cree la tabla con el siguiente comando: 
```bash
$ pnpm exec prisma migrate dev --name init
```
<br>
Para npm seria:
```bash
$ npx prisma migrate dev --name init
```
Con esto ya tendríamos nuestra tabla car creada.
<br>

## Creando nuestro seeder
<br>
Una vez tengamos las tablas, procedemos a crear el archivo encargado de insertar la información en nuestra base de datos. Para esto, creamos un archivo llamado seeder.ts dentro de la carpeta prisma, tú puedes crear el archivo donde quieras pero tienes que recordar la ruta porque la necesitaremos en el siguiente paso.
![Archivo seeder.ts](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ykhkdy5s74s35cif95b1.png)
<br>
Ahora, editaremos el archivo package.json agregando lo siguiente:
```json
"prisma": {
  "seed": "ts-node {ruta_del_archivo}"
}
```
<br>
En mi caso quedaría así: 
![package.json](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sbhzi0o7xvb6zflrh0ub.png)
<br>
Al modificar el package.json y agregarle esa nueva configuración, lo que en realidad estamos haciendo es anexar un nuevo comando al cli de prisma que ahora podemos ejecutar desde una terminal y que ejecuta el archivo seeder.ts que hemos creado anteriormente.
<br>
El último paso sería editar nuestro seeder.ts para que inserte la información que nosotros queramos. Yo lo configure para que guarde dos autos, quedando de la siguiente forma:
```Typescript
import { Prisma, PrismaClient } from '@prisma/client';

const prismaClient = new PrismaClient();

const main = async () => {
  const cars: Prisma.carCreateManyArgs = {
    data: [
      { id: 1, name: 'Toyota', color: 'Rojo' },
      { id: 2, name: 'BMW', color: 'Azul' },
    ],
    skipDuplicates: true,
  };

  await prismaClient.car.createMany(cars);
};

main()
  .catch((e) => {
    console.error(e);
    process.exit(1);
  })
  .finally(async () => {
    await prismaClient.$disconnect();
  });
 
```
<br>
Y luego en una terminal ejecutamos:
```Bash
$ pnpm exec prisma db seed
```
<br>
Para npm: 
```Bash
$ npx prisma db seed
```
<br>
Y eso sería todo!, si revisamos nuestra base de datos veremos que se crearon dos autos:
![dbeaver](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/90bqi18kg4qlsphlxhkh.png)
<br>
El repositorio lo puedes encontrar [aquí.](https://github.com/elbernv/nestjs-prisma-seeder-example)