Búsqueda de sitios web

postgresql - TypeORM no admite la configuración de la base de datos en el decorador de la entidad


Estoy tratando de separar mi proyecto TypeORM en múltiples bases de datos ya que está creciendo en tamaño, y sus componentes son muy discretos (aunque interconectados, así que necesito poder tener relaciones entre bases de datos).

Estoy intentando hacer eso usando la configuración database en el decorador @Entity, como se describe aquí: https://typeorm.io/#multiple-connections/using-multiple-databases-in-a-single-connection

Hice un ejemplo mínimo reproducible para esto, con dos entidades que en teoría deberían colocarse en diferentes bases de datos:

@Entity({ database: 'test' })
export default class Entity1 {
    @PrimaryGeneratedColumn()
    id?: number

    @Column()
    name?: string

    @Column()
    address?: string
}

y

@Entity({ database: 'database2' })
export default class Entity2 {
    @PrimaryGeneratedColumn()
    id?: number

    @Column()
    name?: string

    @Column()
    address?: string
}

Código de conexión:

import {createConnections} from "typeorm";

async function doDbExample() {
    const connections = await createConnections([{
        name: "db1Connection",
        type: "postgres",
        host: "db",
        port: 5432,
        username: "test",
        password: "testPassword",
        database: "test",
        entities: [__dirname + "/entity/*{.js,.ts}"],
        synchronize: true
    }]);

    console.log("Created connections")
}

doDbExample()

Sin embargo, lo que pasa es que la tabla de ambas entidades se coloca en la base de datos de la conexión. ¿Estoy haciendo algo mal, o es un error en TypeORM? Me parece que ya no está respetando la configuración de database.

Estoy ejecutando el código usando ts-node-dev

Hice un ejemplo completo y mínimamente reproducible, completo con configuración dockerizada del entorno de la base de datos, en GitHub: https://github.com/petterroea/TypeOrmBug-MRE

Respuesta #1

Este es un problema de configuración. Lo resolví así:

  1. Modifica el arreglo entities para que cada conexión/base de datos tenga su propia carpeta con archivos de entidades y nombra la entidad que más uses como default:
// src/index.ts
 await createConnections([
      {
        name: 'default',
        host: 'SERVER1',
        username: 'bob',
        password: 'kiwi,
        type: 'mssql',
        database: 'db1',
        ...
       "synchronize": true,
       "entities": ["src/db1/entity/**/*.ts"],
      },
      {
        name: 'connection2,
        host: 'SERVER2',
        username: 'Mike',
        password: 'carrot',
        type: 'mssql',
        database: 'db2,
        ...
       "synchronize": true,
       "entities": ["src/db2/entity/**/*.ts"],
    ])
  1. Crea archivos de entidad para cada base de datos en su carpeta respectiva:

    • src/db1/entity/Fruit.ts > tabla en db1
    • src/db2/entity/Vegetables.ts > tabla en db2

Con "synchronize": true cada tabla se creará automáticamente en la base de datos correcta

  1. Accediendo a los datos en las tablas:

    • Para la conexión default:
import { Fruit} from 'src/db1/entity/Fruit.ts'
  fruits() {
    return Fruit.find()
  }
  • Para la conexión no predeterminada:
import { getRepository } from 'typeorm'
import { Vegetable} from 'src/db2/entity/Vegetable.ts'
  vegetables() {
      return async () => await getRepository(Vegetable).find()
  }

o

  async vegetables() {
    return await getRepository(vegetables, 'connection2').find()
  }

Espero que esto ayude a alguien más que esté luchando con los mismos problemas que tú y yo.