Introducción

1

¿Ya terminaste el Curso de NestJS: Programación Modular?

2

Platzi Store: presentación del proyecto e instalación

Database

3

Cómo instalar Docker para este proyecto

4

Configuración de PostgresSQL en Docker

5

Explorando postgres con interfaces gráficas y terminal

6

Integración de node-postgres con NestJS

7

Conexión como inyectable y ejecutando un SELECT

8

Usando variables de ambiente

TypeORM

9

¿Qué es un ORM? Instalando y configurando TypeORM Module

10

Creando tu primera entidad

11

TypeORM: active record vs. repositories

12

Crear, actualizar y eliminar

13

Cambiar a Mysql demo (opcional)

Migraciones

14

Sync Mode vs. Migraciones en TypeORM

15

Configurando migraciones y npm scripts

16

Corriendo migraciones

17

Modificando una entidad

Relaciones

18

Relaciones uno a uno

19

Resolviendo la relación uno a uno en el controlador

20

Relaciones uno a muchos

21

Resolviendo la relación uno a muchos en el controlador

22

Relaciones muchos a muchos

23

Resolviendo la relación muchos a muchos en el controlador

24

Manipulación de arreglos en relaciones muchos a muchos

25

Relaciones muchos a muchos personalizadas

26

Resolviendo la relación muchos a muchos personalizada en el controlador

Consultas

27

Paginación

28

Filtrando precios con operadores

29

Agregando indexadores

30

Modificando el naming

31

Serializar

Migración a NestJS 9 y TypeORM 0.3

32

Actualizando Dependencias para NestJS 9

33

Cambios en TypeORM 0.3

34

Migraciones en TypeORM 0.3

Próximos pasos

35

Cómo solucionar una referencia circular entre módulos

36

Continúa con el Curso de NestJS: Autenticación con Passport y JWT

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Configurando migraciones y npm scripts

15/36
Recursos

Aportes 21

Preguntas 14

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Lo que vimos:

No olviden ajustarlo a sus datos
.env

TYPEORM_CONNECTION = postgres
TYPEORM_HOST = localhost
TYPEORM_USERNAME = root
TYPEORM_PASSWORD = 123456
TYPEORM_DATABASE = my_db
TYPEORM_PORT = 5432
TYPEORM_SYNCHRONIZE = false
TYPEORM_LOGGING = true
TYPEORM_ENTITIES = src/**/*.entity.ts

TYPEORM_MIGRATIONS = src/database/migrations/*.ts
TYPEORM_MIGRATIONS_DIR = src/database/migrations
TYPEORM_MIGRATIONS_TABLE_NAME = migrations

package.json

"scripts": {
    "typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js",
    "migrations:generate": "npm run typeorm -- migration:generate -n"
  },

Comando para generar la migration

npm run migrations:generate -- init

Si realizaron el test de mysql, no olviden regresarlo a postgres.

database.module.ts

imports: [
    TypeOrmModule.forRootAsync({
      inject: [config.KEY],
      useFactory: (configService: ConfigType<typeof config>) => {
        const { user, password, host, dbName, port } = configService.postgres;

        return {
          type: 'postgres',
          host,
          port,
          username: user,
          password,
          database: dbName,
          synchronize: true,
          autoLoadEntities: true,
        };
      },
    }),
  ],

Si ingresas al curso recientemente, sobre abril de 2023, te recomiendo que vayas a los módulos 32, 33 y 34 antes de seguir, ya que explican como migrar el proyecto a las versiones más recientes. El módulo 34 se centra en las migraciones. Los cambios son importantes, particularmente con las migraciones de TypeORM, ya que ahora pide configurar un archivo data-source.ts y cambia el script. Hazlo y te ahorraras varias horas de investigación y dolores de cabeza.

Algunas cosas en TypeORM son diferentes actualmente (versión 0.3.7) a como están esta lección

  • Ya no existe documentación acerca de archivos de configuración como el ormconfig.json o las variables de entorno
  • Los comandos del CLI funciona de una manera diferente

Hice un pequeño tutorial mostrando los cambios que yo hice para que me funcione el CLI:

Si tienen el error de:

Not enough non-option arguments: got 0, need at least 1

Recomiendo bajar la versión de typeORM a la 0.2.45

npm remove typeorm 
npm install typeorm@0.2.45 --save

Para evitar futuros dolores de cabeza en sus despliegues, traten de definir siempre sus variables de entorno en archivos .env sin dejar espacios antes/después del signo igual:

# Eviten esto 🚫
TYPEORM_CONNECTION = postgres

# Así es mejor ✔️
TYPEORM_CONNECTION=postgres

A mi me Funciono de la siguiente forma:
Crear un dataSource.ts

import { DataSource } from 'typeorm';

export const dataSource = new DataSource({
  type: 'postgres',
  host: 'localhost',
  port: 5432,
  username: 'nada',
  password: '123456',
  database: 'my_db',
  logging: true,
  synchronize: false,
  entities: ['src/**/**/*.entity.ts'],
  migrations: ['src/database/migrations/*.ts'],
});

Posteriormente en packaje.json:

    "typeorm": "typeorm-ts-node-commonjs -d src/database/dataSource.ts",
    "migration:generate": "npm run typeorm migration:generate src/database/initaltables"

Y finalmente correr:

npm run migration:generate

La configuración dada por el profesor dejó de funcionar a partir de la versión 0.3 de typeorm según hilos de issues de github.
La forma en cómo lo resolví fue la siguiente:

  1. Instalé ts-node y typeorm
npm i typeorm
npm install ts-node --save-dev
  1. Creé un archivo donde instancié la clase Datasource en la carpeta config

    Tomar nota que las rutas entities y migrations debe ser acorde a cómo tienen organizadas las carpetas de su proyecto

  2. Configuré package json

"typeorm": "typeorm-ts-node-esm",
"migration:generate": "npm run typeorm migration:generate -- -d src/config/typeOrm.config-migrations.ts src/database/migrations/migration",

Lo que todavía me hace falta mejorar es que todavía no puedo darle un nombre a los archivos dinámicamente.

Tomar nota que para correr el comando migration:generate debe estar encendida la base de datos para recibir peticiones.

Fuentes:
Issue Github
Documentación oficial

Configurando el CLI para migraciones (Actual)

Crear un archivo con una instancia de DataSource

Veamos cómo configurar el CLI de TypeORM para trabajar con migraciones en nuestro proyecto utilizando un archivo de instancia de DataSource.

Crear un archivo con una instancia de DataSource: Para comenzar, crearemos un archivo llamado dataSource.ts en la carpeta src/database. Aquí está un ejemplo de cómo se podría configurar este archivo:

import { DataSource } from 'typeorm';
import { config } from 'dotenv';
import { ConfigService } from '@nestjs/config';

config();
const configService = new ConfigService();

// creamos una nueva instancia de DataSource con un objeto de configuración
export default new DataSource({
  type: 'postgres',
  username: configService.get('POSTGRES_USER'),
  password: configService.get('POSTGRES_PASSWORD'),
  database: configService.get('POSTGRES_DB'),
  port: configService.get('POSTGRES_PORT'),
  host: configService.get('POSTGRES_HOST'),
  synchronize: false,
  logging: true,
	
	// entidades que va a leer
  entities: ['src/*/*/*.entity.ts'],
	
	// donde leerá las migraciones
	migrations: ['src/database/migrations/*.ts'],
	
	// nombre de la tabla de migraciones
	migrationsTableName: 'migrations',
});

Cambios en los comandos del CLI: Ahora, necesitaremos actualizar los comandos en el archivo package.json para reflejar los cambios en el CLI de TypeORM.

{
	"scripts": {
		"typeorm": "typeorm-ts-node-commonjs -d src/database/dataSource.ts",
		"migration:generate": "npm run typeorm migration:generate src/database/migrations/migration"
	}
}

En los comandos actualizados:

  • El comando typeorm se ha cambiado a typeorm-ts-node-commonjs para trabajar con TypeScript en lugar de JavaScript común.
  • El comando migration:generate ahora requiere el uso del flag -dataSource seguido de la ruta al archivo dataSource.ts que hemos creado.

Es importante tener en cuenta que ahora ya no se utiliza el flag -n para indicar el nombre del archivo de migración. En su lugar, al ejecutar el comando migration:generate, debemos especificar la ruta y el nombre del archivo de migración, que en mi caso lo hago de forma automática desde el package.json.

Para crear la migración ejecutamos el siguiente comando:

npm run migration:generate

Y listo, así es como creamos la configuración para generar migraciones.

El curso está algo desfasado, pero a mí me dio con esto 👇🏻

Primero hice una instalación del paquete ts-node como dev:

yarn add ts-node -D

Cree un archivo typeorm.config.ts dentro del src, con lo siguiente:

import { DataSource } from 'typeorm';
import * as dotenv from 'dotenv';

import { environments } from './environments';

dotenv.config({
  path: environments[process.env.NODE_ENV] || '.env',
});

const PostgresDataSource = new DataSource({
  type: 'postgres',
  host: process.env.DATABASE_HOST,
  port: parseInt(process.env.DATABASE_PORT, 10),
  username: process.env.DATABASE_USER,
  password: process.env.DATABASE_PASS,
  database: process.env.DATABASE_NAME,
  synchronize: false,
  logging: true,
  entities: ['src/**/entities/*.entity.ts'],
  migrations: ['src/database/migrations/*.ts'],
});

export default PostgresDataSource;

Y los scripts quedaron así:

      "typeorm": "typeorm-ts-node-commonjs",
      "typeorm:generate": "yarn typeorm migration:generate -d src/typeorm.config.ts src/database/migrations/$MIGRATION_NAME",
      "typeorm:create": "yarn typeorm migration:create src/database/migrations/$MIGRATION_NAME",
      "typeorm:run": "yarn typeorm migration:run -d src/typeorm.config.ts",
      "typeorm:revert": "yarn typeorm revert -d src/typeorm.config.ts"

Y para ejecutar el generate lo hago asi:

MIGRATION_NAME=primer-migration yarn typeorm:generate

Para crear una migración:

MIGRATION_NAME=initial yarn typeorm:create

Fue la manera con la que me quedo lo más dinámico.

hola! me fui a la documentacion actual y esto de ormconfig esta deprecado, recomiendo actualizar esta parte del curso
https://typeorm.io/changelog#breaking-changes-1

Paso configuracion con dontenv para usar variables de entornos:

// src/database.dataSource.ts
import { DataSource } from 'typeorm';
import 'dotenv/config';

export const connectionSource = new DataSource({
  type: 'postgres',
  username: process.env.POSTGRES_USER,
  password: process.env.POSTGRES_PASSWORD,
  database: process.env.POSTGRES_DATABASE,
  port: Number(process.env.POSTGRES_PORT),
  host: process.env.POSTGRES_HOST,
  synchronize: false,
  logging: true,
  entities: ['src/*/*/*.entity.ts'],
  migrations: ['src/database/migrations/*.ts'],
});

Agregamos los siguientes comandos:

"typeorm": "typeorm-ts-node-commonjs -d src/database/dataSource.ts",
"migration:generate": "npm run typeorm migration:generate ./src/database/migrations/init"

ejecutamos el comando:

npm run migration:generate

Dando como resultado la creacion del archivo 👍:

A mi lo que me funciono fue crear un dataSource.ts en la carpeta de database

import { DataSource } from 'typeorm';

export const connectionSource = new DataSource({
  type: 'postgres',
  host: 'localhost',
  port: 5432,
  username: 'root',
  password: '123456',
  database: 'my_db',
  logging: true,
  synchronize: false,
  entities: ['src/**/*.entity.ts'],
  migrations: ['src/database/migrations/*.ts'],
});

luego crear el siguiente script

 "migration:generate": "./node_modules/.bin/ts-node ./node_modules/.bin/typeorm migration:generate -d src/database/dataSource.ts"

y finalmente correrlo en la terminal de la siguiente forma

npm run migration:generate -- src/database/migrations/init 

y eso me genero mi migración, espero les sirva

Revisando una librería que utilizo de algún tiempo atrás para general las entidades, me he encontrado con esto: https://github.com/Kononnable/typeorm-model-generator/issues/329

Básicamente dice que el futuro de TypeORM es incierto, con errores y un mantenimiento muy pobre, otro artìculo sobre el tema está acá. https://news.ycombinator.com/item?id=26888369

**Nota:** En el curso actual se está utilizando una versión de TypeORM de 2021. Sin embargo, en 2024, se han implementado cambios en la configuración de TypeORM. Estos cambios se abordan en la siguiente clase: [Migraciones en TypeORM - Clase 34](https://platzi.com/home/clases/2282-nestjs-typeorm/60889-migraciones-en-typeorm-03/). Asegúrate de revisarla para entender cómo aplicar la nueva configuración correctamente.

En la documentación hay un ejemplo que recomiendo mucho ver:

https://typeorm.io/data-source-options#data-source-options-example

Muestra cuáles son las opciones del objeto de Data Source

Este aspecto de TypeORM es un desastre, para la quien esté usando la versión: 9.0.1 de TypeORM, la forma de poder conectar a una base de datos, ahora es usando un objeto por aparte llamado ‘DataSource’ que ha de exportarse, el archivo que le contiene puede poner en cualquier lugar, pero TypeORM por defecto lo genera en la ruta ./src/data-source.ts, por lo que si se pone con ese nombre en esa ruta lo va a poder encontrar por defecto, si se desea o necesita; también se puede especificar un path a ese archivo, por ejemplo: ‘./src/database/dataSource.ts’ (Ahí lo puse yo), el archivo dataSource.ts debería contener esto:

import { ConfigService } from '@nestjs/config';
import { DataSource } from 'typeorm';
import { config } from 'dotenv';

config();

const configService = new ConfigService();

const connectionSource = new DataSource({
  type: 'postgres',
  port: parseInt(configService.get('DATABASE_PORT'), 10),
  host: configService.get('DATABASE_HOST'),
  username: configService.get('DATABASE_USER'),
  password: configService.get('DATABASE_PASSWORD'),
  database: configService.get('DATABASE_NAME'),
  logging: configService.get('ORM_LOG'),
  synchronize: configService.get('ORM_SYNC'),
  entities: ['src/**/*.entity.ts'],
  migrations: ['./src/database/migrations/*.ts'],
});

connectionSource.initialize();

export { connectionSource };

Para no hard codear las variables de entorno se puede usar dotenv que se instala al instalar @nest/config, como se ve en un comentario de esta guía

Sin embargo, la opción migrations: ['./src/database/migrations/*.ts'] realmente no hace nada, pues en la documentación de TypeORM (El décimo ejemplo), en el ejemplo de este apartado simpre especifican el path en donde se ha de crear el archivo de migraciones:

npx typeorm-ts-node-esm migration:generate ./src/migrations/update-post-table -d ./src/data-source.ts

Si usas npx typeorm-ts-node-esm npm se ahorra un cambio de contexto por así decirlo

Y si no lo pones te salta un error del CLI, por lo que por mantenibilidad, recomendaría dejar ese script del package.json, así:

"migration:generate": "npx typeorm-ts-node-commonjs migration:generate -p -d src/database/dataSource.ts ./migrations/current.migration"

O bien sin poner la ruta ./migrations/current.migration, porque de esa manera se hace menos incómodo de buscar luego, pero toca redactar a mano la ruta en donde se va generar la migración

Tengo problemas para generar las migraciones!

Me aparece el siguiente error: Falta argumento requerido: dataSource.

Alguien que me ayude con esto?

Me siento poderoso con esta clase

Volando ando

Para los que tuvieron problemas en la migración, revisen que tenga node 12 o superior, en mi caso con wsl use https://github.com/nodesource/distributions/blob/master/README.md para instalar la version 17 aunque creo que debí instalar la 15

Me funciono esta configuración en mi package.json:

    "typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js",
    "migration:generate": "npm run typeorm -- migration:generate -n"