【问题标题】:TypeOrm don't synchronize JoinTableTypeOrm 不同步 JoinTable
【发布时间】:2019-12-15 12:08:26
【问题描述】:

我目前正在研究两个架构。一个由 TypeOrm 创建和管理,另一个是 xenforo 实例。我只有对 xenforo 架构的查询权限。每个用户都有保存在不同表上的订阅,需要与用户连接。这是通过再次由 xenforo 管理的连接表完成的,所以我只有读取权限。所以我设置了装饰品,一切正常。但是,尽管实体被标记为非同步 TypeOrm 尝试在 xenforo 模式中创建 JoinTable,但由于缺少权限而失败。 这就是我的实体类的样子:

@ObjectType()
@Entity({ schema: 'dev_xf', name: 'xf_user', synchronize: false })
export class User extends BaseEntity {
  @Field(type => Int)
  @PrimaryGeneratedColumn({ name: 'user_id', unsigned: true })
  id: number;

  @Field()
  @Column()
  username: string;

  @Column({ name: 'is_moderator' })
  isModerator: boolean;

  @Column({ name: 'is_admin' })
  isAdmin: boolean;

  @Field()
  @Column({ name: 'is_banned' })
  isBanned: boolean;

  @OneToOne(type => UserAuthentication)
  @JoinColumn({ name: 'user_id' })
  authentication: UserAuthentication;

  @Field(type => [UserUpgrade])
  @ManyToMany(type => UserUpgrade)
  @JoinTable({
    schema: 'dev_xf',
    name: 'xf_user_upgrade_active',
    joinColumn: {
      name: 'user_id'
    },
    inverseJoinColumn: {
      name: 'user_upgrade_id'
    }
  })
  userUpgrades: Promise<UserUpgrade[]>;
}
@ObjectType()
@Entity({ schema: 'dev_xf', name: 'xf_user_upgrade', synchronize: false })
export class UserUpgrade extends BaseEntity {
  @Field(type => Int)
  @PrimaryGeneratedColumn({ name: 'user_upgrade_id', unsigned: true })
  id: number;

  @Field()
  @Column()
  title: string;
}

是否有解决方法来解决 TypeOrm 尝试创建 JoinTable 尽管两个实体都标记为非同步的问题?

问候阿图尔

【问题讨论】:

    标签: node.js typeorm


    【解决方案1】:

    编辑: 好的,我找不到完成这项工作的方法。似乎需要实现该功能:https://github.com/typeorm/typeorm/issues/3443#issuecomment-455479721

    原答案: 如果您使用两个模式,您的 ormconfig 中应该有两个连接。当您将实体拆分到不同的文件夹(由数据库分隔)时,迁移仅针对该文件夹中的实体执行。

    示例: 您的文件夹结构应如下所示:

    +-- src
        +-- entity
           +-- default
              +-- YourEntity.ts
           +-- external
              +-- User.ts
              +-- UserUpgrade.ts
    

    您的 ormconfig 应该如下所示(不同的实体文件夹)

    {
        "name": "default",
        "database": "default",
        "type": "mariadb",
        "entities": [
          "src/entity/default/**/*.ts"
        ],
        ...
    },
    {
        "name": "external",
        "database": "dev_xf",
        "type": "mariadb",
        "entities": [
          "src/entity/external/**/*.ts"
        ],
        ...
    }
    

    当您现在运行连接 YourDatabase 的迁移时,您只需运行

    typeorm migration:run -c default
    

    并且不会触及外部文件夹中的实体。

    【讨论】:

    • 我正在使用 mariadb。不确定数据库是否正确。因为整个设置工作没有任何问题,所以它正确地将模式名称放在它尝试访问的表的前面。我遇到的唯一问题是它尝试创建 JoinTable 失败,因为它已经存在。因此,理想情况下,我希望将 JoinTable 从自动同步中排除。
    • 你是对的,这没有帮助。我刚刚在 Github 上发现了一个类似的问题,似乎同步对 JoinTable 和 JoinColumn 不起作用:github.com/typeorm/typeorm/issues/3443
    • 感谢您的回答。我刚刚按照您的描述设置了所有内容,我可以毫无问题地查询实体,但跨模式连接似乎已损坏。 node:6016) UnhandledPromiseRejectionWarning: Error: Entity metadata for App#userUpgrades was not found. Check if you specified a correct entity object and if it's connected in the connection options. App 是我的默认实体之一。
    • 只是为了确定,你可以(如果你还没有)在你的实体装饰器中用“数据库”替换“模式”吗?我确实记得我曾经把它们混在一起遇到了一个问题。如果你已经这样做了,你能发布你的 ormconfig.json 吗?
    • 好的,ormconfig 看起来不错,能否请您从默认方案中发布您的 App 实体?错误“未找到 * 的实体元数据”几乎总是基于一些小错字,例如在这个问题中:github.com/typeorm/typeorm/issues/420
    猜你喜欢
    • 2019-07-20
    • 2021-04-26
    • 2020-05-06
    • 1970-01-01
    • 2022-07-07
    • 2022-01-26
    • 2019-07-07
    • 2019-10-31
    • 1970-01-01
    相关资源
    最近更新 更多