【问题标题】:sequelize : cannot seed association values in DB tablesequelize:无法在 DB 表中播种关联值
【发布时间】:2019-02-13 02:38:09
【问题描述】:

我正在尝试使用 sequelize 将关联播种到我的数据库中,这些表是:用户和管理员。为此,我依靠论坛上的this answer。所以这是我的种子:

'use strict';
const bcrypt = require('bcryptjs')
module.exports = {
    up: async (queryInterface, Sequelize) => {
        queryInterface.bulkInsert('Users', [{
            firstName: 'someone',
            lastName: 'awesome',
            email: 'someone@somewhere.com',
            password: bcrypt.hashSync('helloWorld', 8),
            type: 'admin',
            createdAt: new Date(),
            updatedAt: new Date()
        }], {});

        const users = await queryInterface.sequelize.query(
            'SELECT id from Users;'
        );

        return await queryInterface.bulkInsert('Admins', [{
            id: users[0].id,
            phone: '+9999999999',
            status: true, createdAt: new Date(),
            updatedAt: new Date()
        }]);
    },
    down: async (queryInterface) => {
        await queryInterface.bulkDelete('Admins', null, {});
        await queryInterface.bulkDelete('Users', null, {});
    }
};

现在,用户表中的数据已完美显示,但管理表仍为空

编辑:

我尝试使用以下代码打印出 users[0].id:

const users = await queryInterface.sequelize.query(
    "SELECT id from Users"
);

console.log(users[0].id)

输出是undefined

但是数据再次被输入到表中!我知道这里发生了什么,但不知道如何解决!

附: 我还为 up 的第一个方法添加了等待,但这没有改变..

【问题讨论】:

    标签: node.js orm sequelize.js


    【解决方案1】:

    花了一段时间才弄明白,谢谢大家。

    我提到的文献: this question 和 this part官方sequelize文档

    这是有效的代码:

    'use strict';
    const bcrypt = require('bcryptjs');
    const models = require('../models');
    const User = models.User;
    module.exports = {
        up: async (queryInterface, Sequelize) => {
            queryInterface.bulkInsert('Users', [{
                firstName: 'aname',
                lastName: 'alastname',
                email: 'someemail@somewhere.com',
                password: bcrypt.hashSync('poochies', 8),
                type: 'admin',
                createdAt: new Date(),
                updatedAt: new Date()
            }], {});
    
            const user = await User.findOne({
                where: {
                    type: 'admin',
                    email: 'someemail@somewhere.com'
                },
            });
    
            return await queryInterface.bulkInsert('Admins', [{
                id: user.id,
                phone: '+999999999999',
                status: true,
                createdAt: new Date(),
                updatedAt: new Date()
            }], {});
        },
        down: async (queryInterface) => {
            await queryInterface.bulkDelete('Admins', null, {});
            await queryInterface.bulkDelete('Users', null, {});
        }
    };
    

    【讨论】:

      【解决方案2】:

      在查询用户之前,您不会等待用户插入结束,因此:

      const users = await queryInterface.sequelize.query(
         'SELECT id from Users;'
      );
      

      是空的,这个users[0].id一定会抛出类型错误

      将await 添加到您的第一个queryInterface.bulkInsert 应该可以解决此问题

      await queryInterface.bulkInsert('Users', [{ // ...
      

      【讨论】:

      • 对不起,我还在编辑灵魂。在第一个 bulkInsert 上使用 await 应该可以做到!
      • 我这样做了,但是,cli 的响应是:ERROR: Column 'id' cannot be null!但是数据已经插入到用户表中
      • 也许您可以记录 users 的内容以查看该查询返回的内容
      • 您快到了,再进行一些调试和编码,您的代码将按照您的预期运行。我的提示是这样的:查看users的内容,不仅仅是users[0].id,祝你好运!
      • 找到了答案并将其发布在此线程的下方!非常感谢
      【解决方案3】:

      您需要将await 添加到第一个bulkInsert 方法调用中,并将其结果保存到userId 变量中。 bulkInsert promise 使用插入序列的第一个 ID 解析,因此您可以使用它来创建这样的管理员:

      'use strict';
      const bcrypt = require('bcryptjs');
      
      module.exports = {
          up: async (queryInterface, Sequelize) => {
              const userId = await queryInterface.bulkInsert('Users', [{
                  firstName: 'someone',
                  lastName: 'awesome',
                  email: 'someone@somewhere.com',
                  password: bcrypt.hashSync('helloWorld', 8),
                  type: 'admin',
                  createdAt: new Date(),
                  updatedAt: new Date()
              }], {});
      
              return queryInterface.bulkInsert('Admins', [{
                  id: userId,
                  phone: '+9999999999',
                  status: true,
                  createdAt: new Date(),
                  updatedAt: new Date(),
              }]);
          },
          down: async (queryInterface) => {
              await queryInterface.bulkDelete('Admins', null, {});
              await queryInterface.bulkDelete('Users', null, {});
          }
      };
      

      【讨论】:

        【解决方案4】:

        您可以接收插入对象的数组并在管理员插入中使用它。

        let ids = await queryInterface.bulkInsert('Users', [{
                            firstName: 'someone',
                            lastName: 'awesome',
                            email: 'someone@somewhere.com',
                            password: bcrypt.hashSync('helloWorld', 8),
                            type: 'admin',
                            createdAt: new Date(),
                            updatedAt: new Date()
                        }], { returning: ['id'] });
        
        let adminId = ids[0];
        
        //Insert admin
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-30
          • 1970-01-01
          • 1970-01-01
          • 2018-07-21
          • 2019-04-14
          • 2016-09-30
          • 2016-07-23
          • 1970-01-01
          相关资源
          最近更新 更多