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
    ,行具有重复的值

  • 一个表引用另一个没有尊重完整性约束的表

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

  • 主键的数据类型是不同的,例如MySQL有时会以不同的方式为相同的数据类型转换类型

  • 我的案子是第一个。我使用的是的
    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

    参考资料: