是否可以在 TypeOrm 中创建一个没有主键的表?

Mik*_*ulo 8 node.js typescript typeorm

并且仍然设法在另一个实体中执行@OneToMany。

export class ProductsOfOrder { 
    @ManyToOne(() => Order, order => order.products)
    order: Order

    @ManyToOne(() => Product)
    product: Product

    @Column({type: 'integer'})
    amount: number
}
Run Code Online (Sandbox Code Playgroud)

使用 order 外键的情况

@Entity()
export class Order {
    @PrimaryGeneratedColumn('uuid')
    id: string

    @ManyToOne(() => User)
    user: User

    @OneToMany(() => ProductsOfOrder, productsOfOrder => productsOfOrder.order, {cascade: true})
    products: ProductsOfOrder[]
}
Run Code Online (Sandbox Code Playgroud)

Gio*_*ito 11

Ciao,不,你不能,因为实体需要具有 ORM 方面的主列,因为大多数 ORM 操作严重依赖于实体主 ID。


gli*_*a93 6

咳咳,当然,你可以在 TypeORM 中创建没有主键的表。

这是一个不错的肮脏的小技巧:

  1. 向模型中添加一个假主列,并将插入、选择和更新选项设置为 false。
@Entity()
export class EntityWithoutPK {
  /**
  * ! This is a fake attribute
  * This is a workaround for TypeORM's `MissingPrimaryColumnError`
  **/
  @PrimaryColumn({ type: 'uuid', insert: false, select: false, update: false })
  id: never;

  // Other column definitions
}
Run Code Online (Sandbox Code Playgroud)
  1. 生成迁移文件,然后从生成的SQL中删除主列部分

  2. 将同步选项设置为 false

@Entity({ synchronize: false })
export class Order
Run Code Online (Sandbox Code Playgroud)
  1. 运行迁移

笔记

在应用黑客之前,请参阅以下清单。如果您对其中任何一个回答“否”,请创建一个主键。

  1. 您只能按组查询,即通常使用带有另一个索引/FK 列的 where 条件
  2. 单个实体没有意义,你永远不会调用单个实体的方法(例如保存)
  3. 主键对于单个记录占用相当大的空间(例如,用于简单度量的UUID 主键)。
  4. 实体模式不会经常改变;否则,该synchronize: false选项可能会引起很多恐慌。

对于您的情况,在订单表中创建主键是完全有意义的。

  • 我不知道为什么,但仍然尝试选择该列,即使我有“select: false”。类型 0.3.17。 (3认同)