#sequelize.js #migration #seed #sequelize-cli
Вопрос:
hy, для секвенирования и из того, что я видел здесь, для mysql нет массива типов данных (он доступен только для postgres). Обходной путь состоит в использовании геттеров/сеттеров в файлах миграции, как это :
favColors: {
type: Sequelize.STRING,
allowNull: false,
get() {
return this.getDataValue('favColors').split(';')
},
set(val) {
this.setDataValue('favColors',val.join(';'));
},
}
Мой вопрос в том, как насчет файла seeders ? Вот мои файлы миграции и сеялки. Есть идеи, как получить массив «нравится» и «не нравится» в файле сеялки?
файл миграции для пользователей:
'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');
}
};
файл сеялки для пользователей:
'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, {});
}
};
migration file for 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');
}
};
файл сеялки для сообщений:
'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, {});
}
};
Комментарии:
1. приведенный выше код дает результат, моя база данных заполнена, но число «нравится» и «не нравится» не является массивом. В противном случае, когда я использую почтальона для создания нового сообщения, он выдает мне ошибку: «(узел:6148) Необработанное предупреждение об ошибке: Ошибка типа: Не удается прочитать свойство «разделение» неопределенного»
2. После нескольких попыток мне, наконец, удалось отправить запрос почтальону, но все еще остается проблема с симпатиями/антипатиями. Я не получаю массив, только число
3. ни у кого не было идеи? по крайней мере, как сделать сеялки для свойств, созданных с помощью get/set в файлах миграции?