Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
March 31, 2023 10:47 pm GMT

Automatizando la generacin de datos ficticios con Seed, Factory, Faker y TypeORM en NestJS

Introduccin

En muchas ocasiones necesitamos generar datos ficticios para probar nuestro desarrollo o llenar nuestra base de datos de pruebas. La creacin manual de estos datos puede resultar tediosa y llevar mucho tiempo. En este artculo, hablaremos sobre cmo automatizar el proceso de generacin de datos ficticios utilizando TypeORM.

Para empezar es necesaria la instalacin de una extensin adicional ya que TypeORM por si solo no cuenta con una opcin para generar datos ficticios.

npm install --save @nestjs/typeorm [email protected] typeorm-extension

En esta instalacin se requiere la versin 0.3.11 para evitar errores en el reconocimiento de patrones a la hora de cargas las entidades.

Adicional a esto se requiere la instalacin de un driver de conexin a la base de datos.

npm install pg --save

En este caso se usar PosgreSQL por lo que realizamos la instalacin del controlador recomendado por TypeORM en su sitio.

Para este ejemplo se tendrn dos entidades hipotticas user y post .

Por ltimo se hace la instalacin de dependencias necesarias para la ejecucin del cdigo.

npm install --save @nestjs/config @types/bcrypt bcrypt

Para el ejemplo se plantea la siguiente estructura de carpetas.

Estructura de carpetas

Definiendo un Factory

Un factory es una funcin que nos sirve para establecer una estructura u objeto con datos aleatorios ficticios en tiempo de ejecucin. Con el uso de Faker podemos generar nombres, direcciones, nmeros de telfono, correos electrnicos y muchos otros tipos de datos ficticios.

En la definicin de nuestro Factory se cuenta con una instancia de la librera Faker para generar datos aleatorios.

Por ejemplo, el archivo user.factory.ts contendra.

import { hash } from 'bcrypt';import { setSeederFactory } from 'typeorm-extension';import { User, UserRole } from 'src/user/entities/user.entity';export default setSeederFactory(User, async (faker) => {  const user = new User();  user.firstName = faker.name.firstName();  user.lastName = faker.name.lastName();  user.userName = faker.internet.userName(user.firstName, user.lastName);  user.email = faker.internet.email(user.firstName, user.lastName);  user.password = await hash(faker.internet.password(), 10);  user.phone = faker.phone.number();  user.avatar = faker.image.avatar();  user.role = faker.helpers.arrayElement([    UserRole.ADMIN,    UserRole.EDITOR,    UserRole.GHOST,  ]);  user.isActivated = faker.datatype.boolean();  return user;});

Se puede encontrar ms informacin acerca de Faker y sus caractersticas en fakerjs.dev.

Semilla o Seed

A travs 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 creacin de datos.

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

import { hash } from 'bcrypt';import { User, UserRole } from 'src/user/entities/user.entity';import { DataSource } from 'typeorm';import { Seeder, SeederFactoryManager } from 'typeorm-extension';export default class UserSeeder implements Seeder {  public async run(    dataSource: DataSource,    factoryManager: SeederFactoryManager,  ): Promise<any> {    const repository = dataSource.getRepository(User);    const data = {      userName: 'admin',      password: await hash('admin', 10),      role: UserRole.ADMIN,      isActivated: true,    };    const user = await repository.findOneBy({ userName: data.userName });    // Insert only one record with this username.    if (!user) {      await repository.insert([data]);    }    // ---------------------------------------------------    const userFactory = await factoryManager.get(User);    // Insert only one record.    await userFactory.save();    // Insert many records in database.    await userFactory.saveMany(40);  }}

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

import { Post } from 'src/post/entities/post.entity';import { User } from 'src/user/entities/user.entity';import { DataSource } from 'typeorm';import { Seeder, SeederFactoryManager } from 'typeorm-extension';export default class PostSeeder implements Seeder {  public async run(    dataSource: DataSource,    factoryManager: SeederFactoryManager,  ): Promise<any> {    const repository = dataSource.getRepository(User);    const user = await repository.findOneBy({      userName: 'admin',    });    const postFactory = await factoryManager.get(Post);    await postFactory.saveMany(2, { user });  }}

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

import { DataSource } from 'typeorm';import { runSeeders, Seeder, SeederFactoryManager } from 'typeorm-extension';import postFactory from 'database/factories/post.factory';import userFactory from 'database/factories/user.factory';import PostSeeder from './post.seeder';import UserSeeder from './user.seeder';export default class InitSeeder implements Seeder {  public async run(    dataSource: DataSource,    factoryManager: SeederFactoryManager,  ): Promise<any> {    await runSeeders(dataSource, {      seeds: [UserSeeder, PostSeeder],      factories: [userFactory, postFactory],    });  }}

Configuracin de TypeORM

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

import { ConfigModule } from '@nestjs/config';import { DataSource } from 'typeorm';import { SeederOptions } from 'typeorm-extension';import { DataSourceOptions } from 'typeorm/data-source';import InitSeeder from '../seeds/init.seeder';ConfigModule.forRoot({  envFilePath: '.env',});const options = {  type: 'postgres',  host: process.env.DATABASE_HOST || 'localhost',  port: parseInt(String(process.env.DATABASE_PORT), 10) || 5432,  username: process.env.DATABASE_USERNAME,  password: process.env.DATABASE_PASSWORD,  database: process.env.DATABASE_DATABASE,  entities: [__dirname + '/../../src/**/*.entity.ts'],  migrationsTableName: 'migrations',  migrations: [__dirname + '/../migrations/**/*.ts'],  seeds: [InitSeeder],};export const source = new DataSource(  options as DataSourceOptions & SeederOptions,);

Esta configuracin 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 conexin a la base de datos.

DATABASE_HOST=localhostDATABASE_PORT=5432DATABASE_USERNAME=postgresDATABASE_PASSWORD=rootDATABASE_DATABASE=test

Ejecucin

Para ejecutar las migraciones y generacin 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"},

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

npm run mig-gen -- database/migrations/init

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

npm run mig-run

Por ltimo ejecutamos la semilla con el comando seed.

npm run seed

Esto generara un set de datos aleatorios con en la base de datos con el que podemos probar la aplicacin.

El cdigo completo de este ejemplo se encuentra publicado en github si desea descargarlo.

Tambin encuentra ms informacin en el siguiente video. Recuerda darle Like y suscribirte.

Conclusin

La generacin 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 rpida y eficiente.


Original Link: https://dev.to/imgildev/automatizando-la-generacion-de-datos-ficticios-con-seed-factory-faker-y-typeorm-en-nestjs-5fpc

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To