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:
- Ändra arrayen
entitiesså att varje anslutning/databas har sin egen mapp med enhetsfiler och namnge den enhet du använder mest somdefault:
// 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"],
])
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
Åtkomst till data i tabellerna:
- För
default-anslutningen::
- För
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.
