Добрый день, ночи. У меня проблема с выбором базы данных. Я работаю сnesjs и typeorm. Где мне получить доступ к базе данных atos 2 и просмотреть ее записи. Проблема в том, что когда я указываю на него для доступа, он читает первую базу данных вместо второй. Прикрепляю файлы:
typeorm.config.ts: (Местоположение моей второй базы данных)
import { DataSource } from 'typeorm'
import * as dotenv from 'dotenv';
dotenv.config()
export const secondDataSource = new DataSource({
type: 'mysql',
host: process.env.DB_HOST2,
port: parseInt(process.env.DB_PORT2),
username: process.env.DB_USERNAME2,
password: process.env.DB_PASSWORD2,
database: process.env.DB_NAME2,
synchronize: false,
dropSchema: false,
logging: false,
logger: 'file',
entities: [
"./src/*/*/*.entity.ts"
],
migrations:["migrations/*$yarn_config_pruebatestS.ts"]
})
app.module.ts: (Местоположение моей первой базы данных)
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TchiaModule } from './tchia/tchia.module';
import { TfachisaModule } from './tfachisa/tfachisa.module';
@Module({
imports: [ConfigModule.forRoot({ isGlobal: true, envFilePath: `.env.${process.env.NODE_ENV}` }),
TypeOrmModule.forRootAsync({
imports:[ConfigModule],
useFactory: (configService: ConfigService) => ({
type: 'mysql',
host: configService.get('DB_HOST'),
port: configService.get('DB_PORT'),
username: configService.get('DB_USERNAME'),
password: configService.get('DB_PASSWORD'),
database: configService.get('DB_NAME'),
autoLoadEntities: true
}),
inject:[ConfigService],
}),
TchiaModule,
TfachisaModule,
],
controllers: [],
providers: [],
})
export class AppModule { }
tfachisa.service.ts: (место, где я хочу просмотреть таблицу моей второй базы данных)
import { Injectable } from '@nestjs/common';
import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
import { Tfachisa } from './entities/tfachisa.entity';
import { DataSource, Repository } from 'typeorm';
import { secondDataSource } from 'typeorm.config';
@Injectable()
export class TfachisaService {
constructor(
@InjectRepository(Tfachisa)
private readonly tfachisaRepository:Repository<Tfachisa>,
@InjectDataSource(secondDataSource)
private readonly seconddataSource: DataSource
){}
async findAll() {
const data = await this.seconddataSource.query('SELECT * FROM tchia')
console.info(data)
}
}
Основываясь на документации NestJS, касающейся нескольких источников данных (https://docs.nestjs.com/techniques/database#multiple-databases), вам необходимо:
УПД:
Если вы используете TypeOrmModule.forRootAsync, вам также необходимо установить имя источника данных вне useFactory.
Обновлен app.module.ts до правильного состояния. Поле name
должно быть указано для RootAsync.
app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TchiaModule } from './tchia/tchia.module';
import { TfachisaModule } from './tfachisa/tfachisa.module';
@Module({
imports: [ConfigModule.forRoot({ isGlobal: true, envFilePath: `.env.${process.env.NODE_ENV}` }),
// It will be the default data source
TypeOrmModule.forRootAsync({
imports:[ConfigModule],
useFactory: (configService: ConfigService) => ({
type: 'mysql',
host: configService.get('DB_HOST'),
port: configService.get('DB_PORT'),
username: configService.get('DB_USERNAME'),
password: configService.get('DB_PASSWORD'),
database: configService.get('DB_NAME'),
autoLoadEntities: true
}),
inject:[ConfigService],
}),
// It will be the second and named data source ()
TypeOrmModule.forRootAsync({
imports:[ConfigModule],
name: 'secondDataSource'
useFactory: (configService: ConfigService) => ({
type: 'mysql',
host: configService.get('DB_HOST2'),
port: configService.get('DB_PORT2'),
username: configService.get('DB_USERNAME2'),
password: configService.get('DB_PASSWORD2'),
database: configService.get('DB_NAME2'),
synchronize: false,
dropSchema: false,
logging: false,
logger: 'file',
entities: [
"./src/*/*/*.entity.ts"
],
migrations:["migrations/*$yarn_config_pruebatestS.ts"]
}),
inject:[ConfigService],
}),
TchiaModule,
TfachisaModule,
],
controllers: [],
providers: [],
})
export class AppModule { }
tfachisa.service.ts
import { Injectable } from '@nestjs/common';
import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
import { Tfachisa } from './entities/tfachisa.entity';
import { DataSource, Repository } from 'typeorm';
@Injectable()
export class TfachisaService {
constructor(
@InjectRepository(Tfachisa)
private readonly tfachisaRepository:Repository<Tfachisa>,
@InjectDataSource('secondDataSource')
private readonly seconddataSource: DataSource
){}
async findAll() {
const data = await this.seconddataSource.query('SELECT * FROM tchia')
console.info(data)
}
}
Или вы можете попробовать повторно использовать второй источник данных таким образом в app.module.ts
:
TypeOrmModule.forRootAsync({
imports:[ConfigModule],
name: 'secondDataSource'
dataSourceFactory: async () => {
const dataSource = secondDataSource; // don't forget to import this from typeorm.config.ts
return dataSource.initialize();
},
}),
Обновленный ответ. name
для второго источника данных должен находиться в forRootAsync
.
Брат, спасибо тебе большое. У меня уже работает идеально
Добрый вечер. Я сделал то, что мне дали, а также прочитал документацию, но у меня все еще есть та же проблема. Он по-прежнему подключен к BD1 вместо BD2. Продолжаю делать тесты и тесты но все они указывают на BD1. Единственный способ атаковать BD2 — полностью удалить BD1.