Javascript 如何在Sequelize中生成N-M关系中的假记录
我有两个表:Javascript 如何在Sequelize中生成N-M关系中的假记录,javascript,sequelize.js,Javascript,Sequelize.js,我有两个表:User和Scope;基数为N(User)->M(Scope)。当我在用户和范围表中插入假记录时,一切都很顺利,但是如果我在用户和范围表中插入假记录(ID来自用户和范围关系表),它表示用户和范围之间的关系,我收到错误信息: 1: 未处理的拒绝SequelizeUniqueConstraintError:验证错误 2: 未处理的拒绝SequelizeForeignKeyConstraint错误:无法添加或更新子行:外键约束失败(`graph`.`userScope`,约束`userS
User
和Scope
;基数为N(User
)->M(Scope
)。当我在用户
和范围
表中插入假记录时,一切都很顺利,但是如果我在用户
和范围
表中插入假记录(ID来自用户
和范围
关系表),它表示用户
和范围
之间的关系,我收到错误信息:
1:
未处理的拒绝SequelizeUniqueConstraintError:验证错误
2:
未处理的拒绝SequelizeForeignKeyConstraint错误:无法添加或更新子行:外键约束失败(`graph`.`userScope`,约束`userScope\u ibfk\u 1`外键(`scopeId`)在更新级联的删除级联上引用`scope`(`id`))
我试图通过MySQL控制台进行调试(显示引擎INNODB状态\G
):
约束“userScope\u ibfk\u 1”外键('scopeId')在更新级联的删除级联上引用“scope”('id')
正在尝试在索引userScope\u userId\u scopeId\u唯一元组中的子表中添加:
数据元组:3个字段;
0:len4;hex 8000008;asc;;
1:len4;hex 800000A;asc;;
2:len4;hex 8000001;asc;;
但在父表“graph”中范围',在索引主中,
我们能找到的最接近的匹配项是记录:
物理记录:n_字段1;紧凑格式;信息位0
0:len8;六角696E6696D756D00;下确界;;
我发现了一个问题,它让我觉得在关系表中插入数据的方式是不对的,例如,在关系表中添加了重复的关系
我以这种方式插入关系:
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)
}))
);
各表:
我希望在UserScope
表中以随机方式插入假关系,不会出现任何错误
Obs:我已将
金额
设置为1
/手动设置ID,但仍收到此错误。我也读过类似于一的文章,但是…可能导致问题的案例:
unique
字段,字段具有约束unique
,行具有重复的值random
函数和的函数,但没有一个可用函数对我有帮助。我研究并发现,但这同样没有帮助,所以我编写了生成随机值的脚本,并以一种不会重复的方式使用它:
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));
我的项目正在进行中
关系:
为了测试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+节点,我建议使用该包
Obs²:对具有唯一
字段的其他表应用相同的方法
Obs³:另一种选择是实现您自己的功能,使用种子的概念,如Numpy Random
参考资料: