首页 > 解决方案 > 种子文件中的模型创建或批量创建承诺

问题描述

我有一些承诺链来添加数据。如果我在 JavaScript 文件中“正常”使用它,我从 Node.js 开始或以其他方式调用它,它可以工作(或多或少 - 不同的问题)。

但是,如果我想在带有 sequelize-cli (sequelize db:seed:all) 的 sequelize 种子文件中使用它,则这些承诺将不起作用。好的,有一个错误进入.catch链中,但.then不起作用......

承诺字段都是未定义的......

我知道我可以使用 bulkInsert,但是如果我“必须”使用原始 SQL,为什么我要使用 ORM,尤其是如果我在指向 uuid 的表之间有链接?

我定义了模型,有一个“正常”的迁移文件,并且想要带有种子的“开始”数据。我需要单独的东西来使用 create / bulkCreate 承诺吗?

我错过了文档中的某些内容吗?

标签: javascriptnode.jssequelize.jsseed

解决方案


我自己发现了很多尝试和答案: 续集动态播种

需要在模型中固定关联:

User.associate = function(models) {
  User.belongsToMany(
    models.Role, {
      through: 'user_role',
    }
  );
};

Role.associate = function(models) {
  Role.belongsToMany(
    models.User, {
      through: 'user_role',
    }
  );
};

m:n 表需要这个:

....
.then(() => {
  queryInterface.createTable('user_role', {
    userUuid: {
      type: Sequelize.UUIDV4,
      references: {
        model: 'User',
        key: 'uuid',
      },
      allowNull: false,
    },
    roleUuid: {
      type: Sequelize.UUIDV4,
      references: {
        model: 'Role',
        key: 'uuid',
      },
      allowNull: false,
    },
    createdAt: { allowNull: false, type: Sequelize.DATE },
    updatedAt: { allowNull: false, type: Sequelize.DATE },
  });
}).then(() => {
  return queryInterface.addConstraint(
    'user_role',
    ['userUuid', 'roleUuid'], {
      unique: true,
      type: 'primary key',
      name: 'userrole_pkey',
    }
  );
});

将字段重命名为类似于从 sequelize 生成的字段


推荐阅读