TypeORM不支持实体装饰器上的数据库设置

时间:2019-11-16 14:10:26

标签: postgresql typescript typeorm

随着大小的增加,我正试图将我的TypeORM项目分离到多个数据库中,并且它的组件非常离散(但是是相互关联的,所以我需要能够跨数据库的关系)。

我正在尝试使用database装饰器上的@Entity设置来完成此操作,如下所述:https://typeorm.io/#multiple-connections/using-multiple-databases-in-a-single-connection

为此,我做了一个最小的可复制示例,在理论上应将两个实体放在不同的数据库中

@Entity({ database: 'test' })
export default class Entity1 {
    @PrimaryGeneratedColumn()
    id?: number

    @Column()
    name?: string

    @Column()
    address?: string
}

@Entity({ database: 'database2' })
export default class Entity2 {
    @PrimaryGeneratedColumn()
    id?: number

    @Column()
    name?: string

    @Column()
    address?: string
}

连接代码:

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()

但是,发生的情况是两个实体的表都放在连接的数据库中。我是在做错什么,还是TypeORM中的错误?在我看来,它不再遵守database设置。

我正在使用ts-node-dev

运行代码

我在github:https://github.com/petterroea/TypeOrmBug-MRE

上做了一个完整的最小可重现示例,并完成了数据库环境的dockerized设置。

1 个答案:

答案 0 :(得分:1)

这是设置问题。我是这样解决的:

  1. 修改数组default,以使每个连接/数据库都有其自己的包含实体文件的文件夹,并将您最常使用的实体命名为// 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"], ])
src/db1/entity/Fruit.ts
  1. 在每个数据库的各自文件夹中创建实体文件:
      db1中的
    • src/db2/entity/Vegetables.ts>表
    • db2中的
    • "synchronize": true>表

使用default,将在正确的数据库中自动创建每个表

  1. 访问表中的数据:
    • 对于import { Fruit} from 'src/db1/entity/Fruit.ts' fruits() { return Fruit.find() } 连接::
import { getRepository } from 'typeorm'
import { Vegetable} from 'src/db2/entity/Vegetable.ts'
  vegetables() {
      return async () => await getRepository(Vegetable).find()
  }
  • 对于非默认连接:
  async vegetables() {
    return await getRepository(vegetables, 'connection2').find()
  }

for x in range(0, len(wordChars) % 2, 2):
    char_a       = stack[i]
    char_b       = stack[i + 1]
    stack[i]     = char_b
    stack[i + 1] = char_a

我希望这可以帮助其他与您和我一样遇到同样问题的人。