postgresql - TypeORM stöder inte databasinställningen på entitetsdekorationen


Jag försöker separera mitt TypeORM-projekt över flera databaser eftersom det växer i storlek, och dess komponenter är mycket diskreta (men sammanlänkade, så jag behöver kunna ha relationer över databaser).

Jag försöker göra det genom att använda database-inställningen på @Entity-dekorationen, som beskrivs här: https://typeorm.io/#multiple-connections/using-multiple-databases-in-a-single-connection

Jag gjorde ett minimalt reproducerbart exempel för detta, med två entiteter som teoretiskt sett borde placeras i olika databaser:

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

    @Column()
    name?: string

    @Column()
    address?: string
}

och

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

    @Column()
    name?: string

    @Column()
    address?: string
}

Anslutningskod:

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

Men det som händer är att båda enheternas tabell placeras i anslutningens databas. Gör jag något fel, eller är detta en bugg i TypeORM? Det verkar för mig som om det inte längre respekterar inställningen database.

Jag kör koden med ts-node-dev

Jag gjorde ett komplett minimalt reproducerbart exempel, komplett med dockeriserad uppsättning av databasmiljön, på GitHub: https://github.com/petterroea/TypeOrmBug-MRE

Svar #1

Detta är ett installationsproblem. Jag löste det så här:

  1. Ändra arrayen entities så att varje anslutning/databas har sin egen mapp med enhetsfiler och namnge den enhet du använder mest som 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. Skapa enhetsfiler för varje databas i dess respektive mapp:

    • src/db1/entity/Fruit.ts > tabell i db1
    • src/db2/entity/Vegetables.ts > tabell i db2

Med "synchronize": true kommer varje tabell att skapas automatiskt i rätt databas

  1. Åtkomst till data i tabellerna:

    • För default-anslutningen::
import { Fruit} from 'src/db1/entity/Fruit.ts'
  fruits() {
    return Fruit.find()
  }
  • För den icke standardanslutningen:
import { getRepository } from 'typeorm'
import { Vegetable} from 'src/db2/entity/Vegetable.ts'
  vegetables() {
      return async () => await getRepository(Vegetable).find()
  }

eller

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

Jag hoppas att detta hjälper någon annan som kämpar med samma problem som du och jag.