gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:59:48 27 4
gpt4 key购买 nike

我正在尝试将我的 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 上做了一个完整的最小可重现示例,完成了数据库环境的 dockerized 设置: https://github.com/petterroea/TypeOrmBug-MRE

最佳答案

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

  • 修改数组 entities所以每个连接/数据库都有自己的包含实体文件的文件夹,并将您最常用的实体命名为 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 > db1 中的表
  • src/db2/entity/Vegetables.ts > db2 中的表

  • "synchronize": true每个表将在正确的数据库中自动创建
  • 访问表中的数据:
  • 对于 default连接::
  • 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()
    }

    我希望这可以帮助其他人与你和我一样在同样的问题上挣扎。

    关于postgresql - TypeORM 不支持实体装饰器上的数据库设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58891569/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com