22

Configurando el CLI para migraciones

Algunas cosas en TypeORM son diferentes actualmente (versión 0.3.7) a como están la lección de Configurando migraciones y npm scripts

  • 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

Con respecto al CLI, yo hice estos cambios para que me funcione. Me parece que pueden ser mejorables pero no he encontrado una mejor manera de momento

Crear un archivo con una instancia de DataSource

Ahora el CLI te pide que al momento de correr un comando especifiques un archivo donde se encuentre una instancia de la clase DataSource
Yo tengo esto en src/database/dataSource.ts

import { DataSource } from 'typeorm';

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

Cambios en los comandos del CLI

El comando typeorm en el package.json cambió al igual que el comando para generar las migraciones

"typeorm": "typeorm": "typeorm-ts-node-commonjs""migration:generate": "yarn typeorm migration:generate -d src/database/dataSource.ts"

Lo importante a notar acá es que:

  • Usando el flag -d o --dataSource se debe pasar el path donde tenemos nuestra instancia del DataSource que es src/database/dataSource.ts en mi caso
  • El CLI ya no acepta el flag -n para indicar el nombre con el que se creará el archivo con la migración
  • Para correr el comando migration:generate es necesario especificar el path donde queremos que se cree la migración y así también especificar el nombre del archivo
    Yo he corrido el comando de esta manera donde init es el nombre que le estoy dando al archivo
    yarn migration:generate src/database/migrations/init
    Es importante notar que a diferencia de la lección, yo estoy usando yarn en lugar de npm
    Cosas a cambiar usando npm:
  • En lugar de correr el comando con yarn usar npm run
    • "migration:generate": "npm run typeorm migration:generate -d src/database/dataSource.ts"
    • npm run migration:generate src/database/migrations/init

Recomendaciones

Estar atento a la documentación de TypeORM y Nestjs que actualmente se encuentra desactualizada en algunas secciones. Seguramente se publicará una mejor manera de hacer esto en el futuro ya que hacerlo de esta manera funciona pero se está creando 2 instancias de DataSource

  • Una en DatabaseModule con el TypeOrmModule
  • Y otra con este nuevo archivo
Escribe tu comentario
+ 2
Ordenar por:
2
8022Puntos

cómo se pueden pasar las variables de entorno a este archivo para no tener que ignorarlo en el .gitignore y que queden protegidos estos datos?

7
2 años

así puedes configurarlo para que acepte variables de ambiente o entorno

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

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

exportdefaultnew DataSource({
  type: 'postgres',
  username: configService.get('DB_USER'),
  password: configService.get('DB_PASS'),
  database: configService.get('DB_NAME'),
  port: configService.get('DB_PORT'),
  host: configService.get('DB_HOST'),
  synchronize: false,
  logging: true,
  entities: ['src/*/*/*.entity.ts'],
  migrations: ['src/database/migrations/*.ts'],
});

2
5224Puntos
2 años

¿Habrá alguna manera de poder tiparlo?

0
8233Puntos
2 años

no funciona 😦

2
3284Puntos

Dejo un los scripts del archivo package.json que me funcionaron

"typeorm": "typeorm-ts-node-commonjs",
    "migration:generate": "npm run typeorm migration:generate -- --dataSource src/database/dataSource.ts"
2
6802Puntos

Y en el database module como lo podría usar? llevo horas buscando 😔😵‍💫

1
1066Puntos

Yo declaro el nombre de las entidades de la siguiente forma:

import { TABLE_NAMES } from 'src/database/table.names';import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity({
  name: TABLE_NAMES.PRODUCT,
})
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;
}

Si corren con el comando normal, no les va funcionar, intenten con lo siguiente:

"typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js",
    "migrations:generate": "npm run typeorm migration:generate -- -d ./src/database/data-source.ts ./src/database/migrations",
    "migrations:run": "npm run typeorm -- migration:run",
    "migrations:show": "npm run typeorm -- migration:show",
    "migrations:drop": "npm run typeorm -- migration:drop"