gpt4 book ai didi

javascript - 如何在 Sequelize 中生成 N-M 关系中的假记录

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:23:37 26 4
gpt4 key购买 nike

我有两个表:UserScope;基数为 N (User) -> M (Scope)。当我在 UserScope 表中插入虚假记录时,一切顺利,但如果我插入虚假记录(来自 UserScope 表)在 UserScope 关系表中,表示 UserScope 之间的关系,我收到错误:

1:

Unhandled rejection SequelizeUniqueConstraintError: Validation error

2:

Unhandled rejection SequelizeForeignKeyConstraintError: Cannot add or update a child row: a foreign key constraint fails (`graph`.`userScope`, CONSTRAINT 'userScope_ibfk_1' FOREIGN KEY (`scopeId`) REFERENCES `scope` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)

我曾尝试通过 MySQL 控制台进行调试(SHOW ENGINE INNODB STATUS\G):

CONSTRAINT 'userScope_ibfk_1' FOREIGN KEY ('scopeId') REFERENCES 'scope' ('id') ON DELETE CASCADE ON UPDATE CASCADE
Trying to add in child table, in index userScope_userId_scopeId_unique tuple:
DATA TUPLE: 3 fields;
0: len 4; hex 80000008; asc ;;
1: len 4; hex 8000000a; asc ;;
2: len 4; hex 80000001; asc ;;

But in parent table 'graph'. 'scope', in index PRIMARY,
the closest match we can find is record:
PHYSICAL RECORD: n_fields 1; compact format; info bits 0
0: len 8; hex 696e66696d756d00; asc infimum ;;

我找到了this这个问题让我认为我在关系表中插入数据的方式不正确,例如,在关系表中添加了重复关系。

我以这种方式插入关系:

import db from "./models";

import faker from "faker";

import times from "lodash.times";

import random from "lodash.random";

const amount = 10;

db.user.bulkCreate(
times(amount, () => ({
email: faker.internet.email(),
password: faker.internet.password(),
name: `${faker.name.firstName} ${faker.name.lastName}`,
birth: Date.now()
}))
)

db.scope.bulkCreate(
times(amount, () => ({
title: faker.hacker.verb()
}))
)

db.userScope.bulkCreate(
times(amount, () => ({
scopeId: random(1, amount),
userId: random(1, amount)
}))
);

表格:

enter image description here

enter image description here

我希望在 UserScope 表中插入假关系,没有任何错误,并且是随机的。

Obs:我已经将 amount 设置为 1/手动设置了 id,但我仍然收到此错误。我也已经读过类似 this 的帖子一、this一个但是...

最佳答案

可能导致问题的情况:

  1. 对于 unique 字段,字段具有约束 unique 并且行具有重复值

  2. 一个表引用另一个没有绝对完整性约束的表

  3. 引用表的行值与某些引用的键值不匹配

  4. 主键的数据类型不同,例如MySQL有时对相同的数据类型进行不同的类型转换

我的情况是第一个。我正在使用 Lodashrandom 函数和Faker的功能,但没有可用的功能帮助我。我研究并发现 Chance ,但这同样没有帮助,所以我编写了生成随机值的脚本,并以它们不重复的方式使用它:

const randomNumbers = (length, start=1) => {
let array = [...Array(length).keys()].map(value => start + value);

array.sort(() => Math.random() - 0.5);

return array;
};

export { randomUniqueNumbers };

在模型中:

// ...

import { randomUniqueNumbers } from "./util";

let scopeIds = randomUniqueNumbers(length);

let userIds = randomUniqueNumbers(length);

db.userScope
.bulkCreate(
times(length, () => ({
scopeId: scopeIds.pop(),
userId: userIds.pop()
}))
)
.then(userScope => {})
.catch(error => console.log(error));

我在 Github 上的项目.

关系:

enter image description here

为了测试 N-M 关系,我在关系表中添加了另一行以证明一个范围可用于一个或多个用户:

INSERT INTO userScope(createdAt, updatedAt, scopeId, userId) VALUES(STR_TO_DATE('18,05,2019','%d,%m,%Y'), STR_TO_DATE('18,05,2019','%d,%m,%Y'), 1, 1);

Obs:如果你不喜欢Graph QL + Sequelize + Node,我推荐Prisma包。

Obs ²:对具有unique 字段的其他表应用相同的想法

Obs ³:另一种选择是实现您自己的使用种子概念的函数,例如 Numpy Random

引用资料:

Cannot add or update a child row a foreign key constraint fails

MySQL error 1452

Foreign key

Unique

Sequelize belongs to many

Foreign key MySQL

关于javascript - 如何在 Sequelize 中生成 N-M 关系中的假记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56203479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com