Estoy tratando de sembrar una asociación en mi base de datos usando la secuencia, las tablas son: Usuarios y Administradores. Para esto, confío en esta respuesta en el foro. así que aquí está mi semilla:

'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, {});
    }
};

Ahora, los datos en la tabla de usuario se colocan perfectamente pero la tabla de administración permanece vacía

Editar:

Traté de imprimir los usuarios [0] .id con el siguiente código:

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

console.log(users[0].id)

El resultado fue undefined

¡pero los datos volvieron a la tabla! Sé lo que está sucediendo aquí, ¡pero no sé cómo resolverlo!

PD También agregué esperar por el primer método de subida, pero esto no cambió nada.

2
sameer manek 7 sep. 2018 a las 21:08

3 respuestas

La mejor respuesta

Me tomó un tiempo resolver esto, gracias a todos.

Literatura a la que me referí: esta pregunta Y esta parte de la documentación oficial de secuencia

Aquí está el código que funciona:

'use strict';
const bcrypt = require('bcryptjs');
const models = require('../models');
const User = models.User;
module.exports = {
    up: async (queryInterface, Sequelize) => {
        queryInterface.bulkInsert('Users', [{
            firstName: 'sameer',
            lastName: 'manek',
            email: 'sameermanek@hotmail.com',
            password: bcrypt.hashSync('poochies', 8),
            type: 'admin',
            createdAt: new Date(),
            updatedAt: new Date()
        }], {});

        const user = await User.findOne({
            where: {
                type: 'admin',
                email: 'sameermanek@hotmail.com'
            },
        });

        return await queryInterface.bulkInsert('Admins', [{
            id: user.id,
            phone: '+919409662665',
            status: true,
            createdAt: new Date(),
            updatedAt: new Date()
        }], {});
    },
    down: async (queryInterface) => {
        await queryInterface.bulkDelete('Admins', null, {});
        await queryInterface.bulkDelete('Users', null, {});
    }
};
4
sameer manek 8 sep. 2018 a las 10:38

No está esperando que finalice la inserción de los usuarios antes de consultarlos, por lo que esto:

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

Está vacío, y esto users[0].id debe estar arrojando un error de tipo

Agregar un await a tu primer queryInterface.bulkInsert debería solucionarlo

await queryInterface.bulkInsert('Users', [{ // ...
1
Aramil Rey 7 sep. 2018 a las 18:34

Debe agregar await a la primera llamada al método bulkInsert y guardar sus resultados en la variable userId. La promesa bulkInsert se resuelve con la primera ID de secuencia insertada, por lo que puede usarla para crear un administrador como este:

'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, {});
    }
};
0
Eugene Manuilov 25 nov. 2019 a las 20:43