mysql - 如何在 TypeORM 中使用具有自动递增 id 列的表进行级联插入

标签 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[];

}

和子实体:

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;

}

控制台日志显示正在生成的 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

有没有什么方法可以指示 typeorm 捕获 LAST_INSERT_ID() 或以其他方式填充子行上的 foregin key id 字段?

最佳答案

如果 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[];
}

以及当您创建实体时。

const parent: Parent = new Parent();
parent.id = "896b677f-fb14-11e0-b14d-d11ca798dbac"; // your uuid goes here

不幸的是,您也不能使用 @PrimaryGeneratedColumn("uuid")

在JS中生成uuid的库有很多。

uuid-js 示例 - https://github.com/pnegri/uuid-js

const parent: Parent = new Parent();
parent.id = UUID.create(4).toString();

我认为这更像是一种变通方法,而不是解决问题的方法。但是我找不到一种方法来告诉 TypeORM 在级联子级时考虑生成的 ID。

关于mysql - 如何在 TypeORM 中使用具有自动递增 id 列的表进行级联插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48453848/

相关文章:

php - 一般错误 : could not call class constructor'

javascript - NodeJS/AngularJS 无法在网页上显示信息

TypeORM - 连接表上的多对多 where 子句

node.js - 为什么 MongoDB Cursor.maxTimeMS 不起作用?

node.js - 请求 POST Loopback JS 未处理的错误

angular - 错误: both async and sync fetching of the wasm failed

typeorm - 如何使用 TypeORM 查询多对多关系

mysql - 获得非付费成员(member)

从多行读取数据的MySQL语句

php - 在 codeigniter 中连接四个表