Issue
I'm trying to create one table in one database and another table in another database. For this to work there are 2 entities that are addressing the correct database with the @Entity decorator. The problem is that typeorm or rather SQL throws an error that user x can't write in database y.
How to address the different databases correctly?
// src/entity/User.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'
@Entity({database: 'db1'})
export class User {
@PrimaryGeneratedColumn()
id: number
@Column()
mame: string
}
// src/entity/Movie.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'
@Entity({database: 'db2'})
export class Movie {
@PrimaryGeneratedColumn()
id: number
@Column()
title: string
}
The connections are crated with their proper credentials:
// src/index.ts
await createConnection({
name: 'connection1',
host: 'SERVER1',
username: 'bob',
password: 'xxx',
type: 'mssql',
database: 'db1',
synchronize: true,
entities: ['src/entity/**/*.ts'],
migrations: ['src/migration/**/*.ts'],
subscribers: ['src/subscriber/**/*.ts'],
cli: {
entitiesDir: 'src/entity',
migrationsDir: 'src/migration',
subscribersDir: 'src/subscriber',
},
})
await createConnection({
name: 'connection2',
host: 'SERVER2',
username: 'mike',
password: 'xxx',
type: 'mssql',
database: 'db2',
synchronize: true,
entities: ['src/entity/**/*.ts'],
migrations: ['src/migration/**/*.ts'],
subscribers: ['src/subscriber/**/*.ts'],
cli: {
entitiesDir: 'src/entity',
migrationsDir: 'src/migration',
subscribersDir: 'src/subscriber',
},
})
We do need to work with decorators because we also use type-graphql docrators in the class. The funny thing is that when the decorator for entity is left blank we see both tables created in both databases. So the credentials are correct.
I found a similar issue here and requested help here.
Thank you for your help.
Solution
I figured this one out myself with the help in the comments from @Aluan. So here are the steps for anyone else running into this:
- Modify the array
entitiesso each connection/database has its own folder with entity files and name the connection you use the most asdefault:
// 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"],
])
- Create entity files for each database in its respective folder:
src/db1/entity/Fruit.ts> table in db1src/db2/entity/Vegetables.ts> table in db2
With "synchronize": true each table will be created automatically in the correct database
- Accessing data in the tables:
- For the
defaultconnection::
import { Fruit } from 'src/db1/entity/Fruit'
fruits() {
return Fruit.find()
}
- For the non default connection:
import { getRepository } from 'typeorm'
import { Vegetable } from 'src/db2/entity/Vegetable'
vegetables() {
return async () => await getRepository(Vegetable).find()
}
or
async vegetables() {
return await getRepository(vegetables, 'connection2').find()
}
I hope this helps someone else struggling with the same issues as I did.
Answered By - DarkLite1
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.