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í:
- Modifica el arreglo
entitiespara que cada conexión/base de datos tenga su propia carpeta con archivos de entidades y nombra la entidad que más uses comodefault:
// 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"],
])
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
Accediendo a los datos en las tablas:
- Para la conexión
default:
- Para la conexión
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.
