DEV Community

Manuel Gil @imgildev
Manuel Gil @imgildev

Posted on • Updated on

Automatizando la generación de datos ficticios con Seed, Factory, Faker y TypeORM en NestJS

Introducción

En muchas ocasiones necesitamos generar datos ficticios para probar nuestro desarrollo o llenar nuestra base de datos de pruebas. La creación manual de estos datos puede resultar tediosa y llevar mucho tiempo. En este artículo, hablaremos sobre cómo automatizar el proceso de generación de datos ficticios utilizando TypeORM.

Para empezar es necesaria la instalación de una extensión adicional ya que TypeORM por si solo no cuenta con una opción para generar datos ficticios.

npm install --save @nestjs/typeorm typeorm typeorm-extension
Enter fullscreen mode Exit fullscreen mode

Adicional a esto se requiere la instalación de un driver de conexión a la base de datos.

npm install pg --save
Enter fullscreen mode Exit fullscreen mode

En este caso se usará PosgreSQL por lo que realizamos la instalación del controlador recomendado por TypeORM en su sitio.

Para este ejemplo se tendrán dos entidades hipotéticas user y post .

Por último se hace la instalación de dependencias necesarias para la ejecución del código.

npm install --save @nestjs/config @types/bcrypt bcrypt
Enter fullscreen mode Exit fullscreen mode

Para el ejemplo se plantea la siguiente estructura de carpetas.

Estructura de carpetas

Definiendo un Factory

Un factory es una función que nos sirve para establecer una estructura u objeto con datos aleatorios ficticios en tiempo de ejecución. Con el uso de Faker podemos generar nombres, direcciones, números de teléfono, correos electrónicos y muchos otros tipos de datos ficticios.

En la definición de nuestro Factory se cuenta con una instancia de la librería Faker para generar datos aleatorios.

Por ejemplo, el archivo user.factory.ts contendría.

Se puede encontrar más información acerca de Faker y sus características en fakerjs.dev.

Semilla o Seed

A través de un seed o semilla se puede generar un set de datos aleatorios, para ello se hace uso de una clase seeder que se apoya de un Factory para la creación de datos.

Lo podemos ver en el archivo user.seeder.ts.

En el caso de la entidad post existe una relación que requiere de un usuario en la base de datos, por lo que se hace uso de un dato conocido para agregar esta relación, el archivo post.seeder.ts sería el siguiente.

Para poder tener un mejor control de la ejecución del sets es importante definir un punto de entrada, el cual tiene el nombre init.seeder.ts por convención y será llamado en las configuraciones de TypeORM.

Configuración de TypeORM

Para este ejemplo se define un archivo typeorm.config.ts en el que se hace uso de las entidades, migraciones y seeds.

Esta configuración requiere de las variables de entorno por lo que se hace uso del ConfigModule .

En el archivo .env se deben actualizar las variables para la conexión a la base de datos.

DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_USERNAME=postgres
DATABASE_PASSWORD=root
DATABASE_DATABASE=test
Enter fullscreen mode Exit fullscreen mode

Ejecución

Para ejecutar las migraciones y generación de datos aleatorios se agregan las configuraciones requeridas en el archivo package.json:

"scripts": {
  ...
  "typeorm": "ts-node -r tsconfig-paths/register node_modules/typeorm/cli.js -d database/config/typeorm.config.ts",
  "mig-gen": "npm run typeorm migration:generate -- ",
  "mig-run": "npm run typeorm migration:run",
  "mig-rev": "npm run typeorm migration:revert",
  "seed": "ts-node -r tsconfig-paths/register node_modules/typeorm-extension/dist/cli/index.js seed -d database/config/typeorm.config.ts"
},
Enter fullscreen mode Exit fullscreen mode

Para iniciar ejecutamos el comando migration:generate a través del atajo que se acaba de ingresar.

npm run mig-gen -- database/migrations/init
Enter fullscreen mode Exit fullscreen mode

Una vez creado el archivo con la migración inicial, corremos esta migración con el atajo de migration:run.

npm run mig-run
Enter fullscreen mode Exit fullscreen mode

Por último ejecutamos la semilla con el comando seed.

npm run seed
Enter fullscreen mode Exit fullscreen mode

Esto generaría un set de datos aleatorios con en la base de datos con el que podemos probar la aplicación.

El código completo de este ejemplo se encuentra publicado en github si desea descargarlo.

GitHub logo ManuelGil / nest-typeorm-seed-example

This is a example of seeding with TypeOrm and NestJS

Nest Logo

A progressive Node.js framework for building efficient and scalable server-side applications.

NPM Version Package License NPM Downloads CircleCI Coverage Discord Backers on Open Collective Sponsors on Open Collective Support us

Description

Nest framework TypeScript starter repository.

Installation

$ npm install
Enter fullscreen mode Exit fullscreen mode

Running the app

# development
$ npm run start

# watch mode
$ npm run start:dev

# production mode
$ npm run start:prod
Enter fullscreen mode Exit fullscreen mode

Test

# unit tests
$ npm run test

# e2e tests
$ npm run test:e2e

# test coverage
$ npm run test:cov
Enter fullscreen mode Exit fullscreen mode

Support

Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please read more here.

Stay in touch

License

Nest is MIT licensed.

Conclusión

La generación de datos ficticios es una parte importante del desarrollo de aplicaciones. Utilizando Seed, Factory y Faker podemos automatizar este proceso y ahorrar mucho tiempo. Con estos tres elementos se puede generar grandes cantidades de datos ficticios de forma rápida y eficiente.

Top comments (5)

Collapse
 
supermavster profile image
Miguel Ángel

Excelent work! BUT all this change in the verion 3.0.1 of the typeorm-extension

Collapse
 
imgildev profile image
Manuel Gil @imgildev

Thank you for your comment! I will review the new changes and update the post.

Collapse
 
jairofernandez profile image
Jairo Fernández

use 2.8.x, works for me at latest nestjs version

Collapse
 
sambenzt profile image
Sam

Excelente guia, me sirvio bastante ya que estoy empezando con este framework

Collapse
 
patrissiamm profile image
Patricia Medina Meneses

I have this error.
No changes in database schema were found - cannot generate a migration. To create a new empty migration use "typeorm migration:create" command