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

Modificando una entidad

17/36
Recursos

Aportes 8

Preguntas 6

Ordenar por:

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

Lo que vimos:

product.entity.ts

import {
  PrimaryGeneratedColumn,
  Column,
  Entity,
  CreateDateColumn,
  UpdateDateColumn,
} from 'typeorm';

@Entity()
export class Product {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ type: 'varchar', length: 255, unique: true })
  name: string;

  @Column({ type: 'text' })
  description: string;

  @Column({ type: 'int' })
  price: number;

  @Column({ type: 'int' })
  stock: number;

  @Column({ type: 'varchar' })
  image: string;

  @CreateDateColumn({
    type: 'timestamptz',
    default: () => 'CURRENT_TIMESTAMP',
  })
  createAt: Date;

  @UpdateDateColumn({
    type: 'timestamptz',
    default: () => 'CURRENT_TIMESTAMP',
  })
  updateAt: Date;
}

En mi caso que estoy usando mysql solo me funciono de esta forma

@Column({ type: "timestamp", default: () => "CURRENT_TIMESTAMP"})
  createAt: Date;

@Column({ type: "timestamp", default: () => "CURRENT_TIMESTAMP"})
  updateAt: Date;

Al agregar cambios a una entidad, se tiene que generar la migracion y ejecutarla.

Se le agrega a la entidad product las fechas de creacion y actualizacion automaticas:

import {
  PrimaryGeneratedColumn,
  Column,
  Entity,
  CreateDateColumn,
  UpdateDateColumn,
} from 'typeorm';

@Entity()
export class Product {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ type: 'varchar', length: 255, unique: true })
  name: string;

  @Column({ type: 'text' })
  description: string;

  @Column({ type: 'int' })
  price: number;

  @Column({ type: 'int' })
  stock: number;

  @Column({ type: 'varchar' })
  image: string;

  @CreateDateColumn({
    type: 'timestamptz',
    default: () => 'CURRENT_TIMESTAMP',
  })
  createAt: Date;

  @UpdateDateColumn({
    type: 'timestamptz',
    default: () => 'CURRENT_TIMESTAMP',
  })
  updateAt: Date;

Se genera la migracion npm run migrations:generate -- add-fields

Migration /home/wlensinas/code/nestjs-typeorm/src/database/migrations/1621891104050-add-fields.ts has been generated successfully.

Se ejecutan los cambios en la base de datos npm run migrations:run

query: SELECT * FROM "information_schema"."tables" WHERE "table_schema" = current_schema() AND "table_name" = 'migrations'
query: SELECT * FROM "migrations" "migrations" ORDER BY "id" DESC
1 migrations are already loaded in the database.
2 migrations were found in the source code.
init1621883836551 is the last executed migration. It was executed on Mon May 24 2021 16:17:16 GMT-0300 (Argentina Standard Time).
1 migrations are new migrations that needs to be executed.
query: START TRANSACTION
query: ALTER TABLE "product" ADD "createAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
query: ALTER TABLE "product" ADD "updateAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
query: INSERT INTO "migrations"("timestamp", "name") VALUES ($1, $2) -- PARAMETERS: [1621891104050,"addFields1621891104050"]
Migration addFields1621891104050 has been executed successfully.
query: COMMIT

Se listan los cambios npm run migrations:show

query: SELECT * FROM "information_schema"."tables" WHERE "table_schema" = current_schema() AND "table_name" = 'migrations'
query: SELECT * FROM "migrations" "migrations" ORDER BY "id" DESC
 [X] init1621883836551
 [X] addFields1621891104050

Este curso esta genial, he aprendido una gran cantidad de conceptos y buenas practicas que no sabía ni que existían

[ExceptionHandler] No repository for "Brand" was found. Looks like this entity is not registered in current 
"default" connection? +184ms

Por si les sale este error, recuerden agregar en el archivo database.module.ts la propiedad de autoLoadEntities.

Modificando una entidad

Supongamos que ahora queremos modificar una entidad como por ejemplo Product, veamos como hacerlo:

  • **src/products/entities/product.entity.ts**:
@Entity()
export class Product {
  // ...

  // fecha de producto creado con formato de zona horaría automática y creado de forma automática
  @CreateDateColumn({ type: 'timestamptz', default: () => 'CURRENT_TIMESTAMP' })
  createdAt: Date;

  // fecha de producto actualizado con formato de zona horaría automática y creado de forma automática
  // se actualiza cada que hagamos un "".save()"
  @UpdateDateColumn({ type: 'timestamptz', default: () => 'CURRENT_TIMESTAMP' })
  updatedAt: Date;
}

¿Pero ahora como le decimos a nuestra API que actualizamos esta entidad? Para esto vamos a nuestra terminal y ejecutamos los siguientes comandos.

# creamos migración
npm run migration:generate

# ejecutamos migración
npm run migration:run

Y listo, ya debería actualizar nuestros datos en nuestra tabla de manera adecuada, así de fácil es correr migraciones de actualización de entidades con TypeORM:

otra forma en que podría entenderse las migraciones, es que cada una representa un estado de la BD en alguna instancia de tiempo, tenerlas organizadas de esta manera nos permite incluso regresarnos a algún estado anterior si es necesario.

Maravilloso el curso hasta aquí, ¡vamos con todo!