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 20

Preguntas 14

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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 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

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 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.

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

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

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.

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 鈥楧ataSource鈥 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"