NestJS TypeORM:使用两个或多个数据库?

新手上路,请多包涵

我从两天前开始尝试解决这个问题,也许我只是忽略了这里的重点。

我的目标是编写一个 NestJS 应用程序(包含 TypeORM),它为我的 2 个或 3 个小项目提供 RestAPI,而不是为每个项目编写一个 NestJS-App。

到目前为止一切顺利,该应用程序已准备就绪,适用于单个项目(它们位于具有实体、控制器、服务、模块的子文件夹中),但我无法让它与所有项目一起运行。

重点似乎是配置,我正在使用 ormconfig.json

 [ {
    "name": "Project1",
    "type": "mysql",
    "host": "localhost",
    "port": 3306,
    "username": "<username>",
    "password": "<pwd>",
    "database": "<database>",
    "synchronize": false,
    "entities": ["project1/*.entity.ts"],
    "subscribers": ["project1/*.subscriber.ts"],
    "migrations": ["project1/migrations/*.ts"],
    "cli": { "migrationsDir": "project1/migrations" }
}, {
    "name": "project2",
    "type": "mysql",
    "host": "localhost",
    "port": 3306,
    "username": "<another-username>",
    "password": "<another-pwd>",
    "database": "<another-database>",
    "synchronize": false,
    "entities": ["project2/*.entity.ts"],
    "subscribers": ["project2/*.subscriber.ts"],
    "migrations": ["project2/migrations/*.ts"],
    "cli": { "migrationsDir": "project2/migrations"
    } ]

错误消息说:

[ExceptionHandler] 找不到连接默认值,因为它未在任何 orm 配置文件中定义

当然找不到“default”,因为我提供了两个具有不同于“default”的唯一名称的配置。

ApplicationModule 中,我可以提供连接的名称,如下所示:

 TypeOrmModule.forRoot( { name: "project1" } ),

但它只适用于一个项目。

我可以将所有内容混合在一个配置中,但随后我会将所有内容都放在一个数据库中,所有用户都是同一个用户,并且可能会混合实体……

有人可以给我提示如何解决这个问题吗?也许在每个模块中都有 getConnection(<name>) ,但是如何启动 ApplicationModule 呢?

亲切的问候,

萨格罗伯特

原文由 sagerobert 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

我只是尝试使用多个数据库和一个 ormconfig.json 设置 TypeORM,但它对我根本不起作用。它似乎总是使用 default 连接,当没有发现默认(= 没有显式名称)连接时,它会抛出相应的错误。

虽然当我在 app.module.ts 中定义连接时它确实起作用了(我删除了 ormconfig.json ):

 imports: [
  ...,
  TypeOrmModule.forRoot({
    name: 'Project1',
    type: 'mysql',
    host: 'localhost',
    port: 3306,
    username: '<username>',
    password: '<pwd>',
    database: '<database>',
    synchronize: false,
    entities: ['project1/*.entity.ts'],
    subscribers: ['project1/*.subscriber.ts'],
    migrations: ['project1/migrations/*.ts'],
    cli: { migrationsDir: 'project1/migrations' },
  }),
  TypeOrmModule.forRoot({
    name: 'project2',
    type: 'mysql',
    host: 'localhost',
    port: 3306,
    username: '<another-username>',
    password: '<another-pwd>',
    database: '<another-database>',
    synchronize: false,
    entities: ['project2/*.entity.ts'],
    subscribers: ['project2/*.subscriber.ts'],
    migrations: ['project2/migrations/*.ts'],
    cli: { migrationsDir: 'project2/migrations' },
  })
]

原文由 Kim Kern 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您使用多个数据库连接,则需要在 TypeOrmModule.forRoot({ name: ‘db1Connection’ }) 内部的同一级别显式传递连接名称。

 TypeOrmModule.forRootAsync({
  name: DB1_CONNECTION,
  imports: [ConfigModule],
  useClass: TypeormDb1ConfigService,
}),

TypeOrmModule.forRootAsync({
  name: DB2_CONNECTION,
  imports: [ConfigModule],
  useClass: TypeormDb2ConfigService,
})

原文由 Frozenex 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题