es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Sembrador para accesores/modificadores en Sequelize MySQL.

Hola,
para Sequelize y según lo que he visto aquí, no hay un Datatypes Array para mysql (sólo está disponible para postgres). Una solución consiste en utilizar getters/setters en los archivos de migración de la siguiente manera:

favColors: {
    type: Sequelize.STRING,
    allowNull: false,
    get() {
        return this.getDataValue('favColors').split(';')
    },
    set(val) {
       this.setDataValue('favColors', val.join(';'));
    },
},

Mi pregunta es ¿cómo sería el archivo de sembrado (seeder file)?
Estos son mis archivos de migración y sembrado. ¿Alguna idea de cómo obtener los arrays de likers y dislikers en el archivo de sembrado?

Archivo de migración para usuarios:

'use strict';

module.exports = {
    up: async(queryInterface, Sequelize) => {
        await queryInterface.createTable('Users', {
            id: {
                allowNull: false,
                autoIncrement: true,
                primaryKey: true,
                type: Sequelize.INTEGER
            },
            firstName: {
                type: Sequelize.STRING
            },
            familyName: {
                type: Sequelize.STRING
            },
            email: {
                type: Sequelize.STRING
            },
            password: {
                type: Sequelize.STRING
            },
            role: {
                type: Sequelize.STRING
            },
            photoUrl: {
                type: Sequelize.STRING
            },
            createdAt: {
                allowNull: false,
                type: Sequelize.DATE
            },
            updatedAt: {
                allowNull: false,
                type: Sequelize.DATE
            }
        });
    },
    down: async(queryInterface, Sequelize) => {
        await queryInterface.dropTable('Users');
    }
};

Archivo de sembrado para usuarios:

'use strict';

const faker = require('faker');
const bcrypt = require('bcrypt');

module.exports = {
    up: async(queryInterface, Sequelize) => {
        let users = [];
        let roles = ['ADMIN', 'MODER', 'BASIC'];

        for (let i = 0; i < 25; i++) {
            let r = Math.random().toString(36).substring(7);
            let pwdHashed = await bcrypt.hash(r, 10);
            //let userRole = roles[(Math.random() * roles.length) | 0];
            let userRole = roles[Math.floor(Math.random() * roles.length)];
            users.push({
                firstName: faker.name.firstName(),
                familyName: faker.name.lastName(),
                email: faker.internet.email(),
                password: pwdHashed,
                role: userRole,
                photoUrl: faker.image.avatar(),
                createdAt: new Date(),
                updatedAt: new Date()
            });
        };
        await queryInterface.bulkInsert('Users', users, {})
    },

    down: async(queryInterface, Sequelize) => {
        await queryInterface.bulkDelete('Users', null, {});
    }
};

Archivo de migración para publicaciones (posts):

'use strict';
module.exports = {
    up: async(queryInterface, Sequelize) => {
        await queryInterface.createTable('Posts', {
            id: {
                allowNull: false,
                autoIncrement: true,
                primaryKey: true,
                type: Sequelize.INTEGER
            },
            posterId: {
                type: Sequelize.UUID,
                referes: {
                    model: "Users",
                    key: "id"
                }
            },
            title: {
                type: Sequelize.STRING
            },
            content: {
                type: Sequelize.TEXT
            },
            imageUrl: {
                type: Sequelize.STRING
            },
            videoUrl: {
                type: Sequelize.STRING
            },
            likers: {
                type: Sequelize.STRING,
                get() {
                    return this.getDataValue('likers').split(';')
                },
                set(val) {
                    this.setDataValue('likers', val.join(';'));
                },
                required: true
            },
            dislikers: {
                type: Sequelize.STRING,
                get() {
                    return this.getDataValue('dislikers');
                },
                set(val) {
                    this.setDataValue('dislikers', dislikers.push(val));
                },
                required: true
            },
            likes: {
                type: Sequelize.INTEGER,
                default: 0
            },
            dislikes: {
                type: Sequelize.INTEGER,
                default: 0
            },
            createdAt: {
                allowNull: false,
                type: Sequelize.DATE
            },
            updatedAt: {
                allowNull: false,
                type: Sequelize.DATE
            }
        });
    },
    down: async(queryInterface, Sequelize) => {
        await queryInterface.dropTable('Posts');
    }
};

Archivo de sembrado para publicaciones (posts):

'use strict';
const faker = require('faker');

module.exports = {
    up: async(queryInterface, Sequelize) => {
        let posts = [];
        let fakeLikersDislikers = [];

        for (let i = 0; i < 25; i++) {
            posts.push({
                posterId: faker.datatype.uuid(),
                title: faker.lorem.sentence(),
                content: faker.lorem.sentence(),
                imageUrl: faker.image.city(),
                videoURL: faker.image.nature(),
                //videoURL: `${faker.image.nature()}?random=${Date.now()}`,


                likers: fakeLikersDislikers.push(faker.name.findName()),
                dislikers: fakeLikersDislikers.push(faker.name.findName()),
                likes: faker.datatype.number(),
                dislikes: faker.datatype.number(),
                createdAt: new Date(),
                updatedAt: new Date(),
            });
        };
        await queryInterface.bulkInsert('Posts', posts, {})
    },

    down: async(queryInterface, Sequelize) => {
        await queryInterface.bulkDelete('Posts', null, {});
    }
};
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener los arrays de “likers” y “dislikers” en el archivo “seeder”, se puede utilizar el mismo enfoque de accesores/mutadores que en el archivo de migración para las publicaciones. A continuación, se muestra un ejemplo de cómo hacerlo en el archivo “seeder” para publicaciones:

    'use strict';
    const faker = require('faker');
    const bcrypt = require('bcrypt');
    
    module.exports = {
      up: async (queryInterface, Sequelize) => {
        let posts = [];
        let fakeLikersDislikers = [];
    
        for (let i = 0; i < 25; i++) {
          let liker = faker.name.findName();
          let disliker = faker.name.findName();
    
          fakeLikersDislikers.push(liker);
          fakeLikersDislikers.push(disliker);
    
          posts.push({
            posterId: faker.datatype.uuid(),
            title: faker.lorem.sentence(),
            content: faker.lorem.sentence(),
            imageUrl: faker.image.city(),
            videoURL: faker.image.nature(),
            likers: fakeLikersDislikers.join(';'),
            dislikers: fakeLikersDislikers.join(';'),
            likes: faker.datatype.number(),
            dislikes: faker.datatype.number(),
            createdAt: new Date(),
            updatedAt: new Date(),
          });
        }
        await queryInterface.bulkInsert('Posts', posts, {})
      },
    
      down: async (queryInterface, Sequelize) => {
        await queryInterface.bulkDelete('Posts', null, {});
      }
    };
    

    Nota que creamos un arreglo vacío fakeLikersDislikers y empujamos los nombres de “liker” y “disliker” en él en el bucle. Luego usamos join(';') para unir los elementos de estos arreglos en una cadena con un delimitador de punto y coma, la cual establecemos como las propiedades de “likers” y “dislikers” del objeto “posts”. Finalmente, llamamos a bulkInsert en el objeto “queryInterface” para insertar las “publicaciones” en la base de datos.

Comments are closed.