sequelize:无法在数据库表中播种关联值

时间:2018-09-07 18:08:51

标签: node.js orm sequelize.js

我正在尝试使用sequelize将关联播种到我的数据库中,表为:Users和Admins。为此,我依靠论坛上的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

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

P.S。 我还添加了等待up的第一种方法,但这并没有改变。.

4 个答案:

答案 0 :(得分:2)

花了一段时间才弄清楚,谢谢大家。

我提到的文学: this questionthis part的官方续集文件

这是有效的代码:

_controllers[index].text

答案 1 :(得分:0)

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

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

为空,并且此users[0].id必须抛出类型错误

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

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

答案 2 :(得分:0)

您需要将await添加到第一个bulkInsert方法调用中,并将其结果保存到userId变量中。 bulkInsert承诺通过插入序列的第一个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, {});
    }
};

答案 3 :(得分:0)

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

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