我目前正在研究两个架构。一个是由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的问题是否解决?
问候阿图尔
最佳答案
编辑:
好的,我找不到找到这项工作的方法。似乎需要实现该功能: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
并且不会触摸外部文件夹中的实体。
关于node.js - TypeOrm不同步JoinTable,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57401431/