Mil*_*ton 6 mysql node.js typeorm
我正在尝试使用typeorm. 子表条目包括对父表上 ID 字段的外键引用。
似乎typeorm没有id从父行捕获自动增量并将其提供给子行insert。
这是父实体:
import ...
@Entity("parent")
export class Parent {
@PrimaryGeneratedColumn()
id: number;
@OneToOne(type => Account, accountId => accountId.provider)
@JoinColumn({name: "account_id"})
accountId: Account;
@Column("varchar", {
name: "name",
nullable: false,
length: 255,
})
name: string;
@OneToMany(type => Child, Children => Children.parentId, {
cascadeInsert: true,
cascadeUpdate: true
})
Children: Child[];
}
Run Code Online (Sandbox Code Playgroud)
和子实体:
import ...
@Entity("child")
export class Child{
@PrimaryGeneratedColumn()
id: number;
@ManyToOne(type => Parent, parentId => parentId.children)
@JoinColumn({name: "parent_id"})
parentId: Parent;
@Column("varchar", {
name: "number",
nullable: true,
length: 45,
})
number: string;
}
Run Code Online (Sandbox Code Playgroud)
控制台日志显示生成的sql不包含外键列,产生明显错误 ER_NO_DEFAULT_FOR_FIELD: Field 'parent_id' doesn't have a default value
info: executing query: START TRANSACTION
info: executing query: INSERT INTO parent(name, account_id) VALUES (?,?) -- PARAMETERS: ["Name","id"]
info: executing query: INSERT INTO child(number) VALUES (?) -- PARAMETERS: ["12345678"]
info: query failed: INSERT INTO child(number) VALUES (?) -- PARAMETERS: ["12345678"]
info: error: { Error: ER_NO_DEFAULT_FOR_FIELD: Field 'parent_id' doesn't have a default value
Run Code Online (Sandbox Code Playgroud)
是否可以通过某种方式指示 typeorm 捕获 LAST_INSERT_ID() 或以其他方式填充子行上的外键 ID 字段?
小智 3
如果 id 不是自动生成的,而是在保存实体之前分配的,则它可以工作。
使用 uuid 作为主键。
import ...
@Entity("parent")
export class Parent {
@PrimaryColumn()
id: string;
@OneToOne(type => Account, accountId => accountId.provider)
@JoinColumn({name: "account_id"})
accountId: Account;
@Column("varchar", {
name: "name",
nullable: false,
length: 255,
})
name: string;
@OneToMany(type => Child, Children => Children.parentId, {
cascadeInsert: true,
cascadeUpdate: true
})
Children: Child[];
}
Run Code Online (Sandbox Code Playgroud)
以及当您创建实体时。
const parent: Parent = new Parent();
parent.id = "896b677f-fb14-11e0-b14d-d11ca798dbac"; // your uuid goes here
Run Code Online (Sandbox Code Playgroud)
不幸的是你也不能使用@PrimaryGeneratedColumn("uuid")。
在JS中有很多库可以生成uuid。
uuid-js 示例 - https://github.com/pnegri/uuid-js
const parent: Parent = new Parent();
parent.id = UUID.create(4).toString();
Run Code Online (Sandbox Code Playgroud)
我认为这更像是一种解决方法,而不是问题的解决方案。但我找不到一种方法来告诉 TypeORM 在级联子级时考虑生成的 id。
| 归档时间: |
|
| 查看次数: |
5581 次 |
| 最近记录: |