#sequelize-cli
#исправлять cli
Вопрос:
я пытаюсь объединить таблицы в node sequelize.попробуйте получить данные из этих двух таблиц, но они не работают должным образом, я думаю, что некоторые проблемы в моем коде, пожалуйста, помогите мне решить эти проблемы с помощью Linux mint. начал node sequelize через несколько дней.теперь используется база данных postgres
emploee table
const Sequelize = require("sequelize");
const db = require("../config/database");
const dataType = db.sequelize;
const Employee = dataType.define("employee", {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
username: {
type: Sequelize.STRING,
},
password: {
type: Sequelize.STRING
},
employeename:{
type:Sequelize.STRING
},
});
module.exports = Employee;
таблица пользователя
const Sequelize = require("sequelize"); //use sequelize
const db=require("../config/database"); //connect sequelize
const dataType = db.sequelize;
const User = dataType.define("user",{ //table name
id:{
type:Sequelize.INTEGER, //crete columns
autoIncrement:true,
primaryKey:true
},
username:{
type:Sequelize.STRING
},
email:{
type:Sequelize.STRING
}
});
module.exports = User; //export table
service.js
exports.views= req =>{
console.log("enterd get service",req.body);
return User.findAll({
include:[
{
model:Employee
}
]
}).then(User =>{
console.log("user data is=",User);
const resobj= User.map(user=>{
return Object.assign(
{},
{
email:User.email,
sarath:user.sarath.map(Employee=>{
return Object.assign(
{},
{
username:Employee.username,
employeename:Employee.employeename,
}
)
})
}
)
});
return resobj;
}).catch(err=>{
return console.log("ERR IS",err);
});
};
продолжить
const Sequelize = require("sequelize");
// const Op = Sequelize.Op;
const Op=Sequelize.Op;
const sequelize = new Sequelize(
"postgres", //db name
"postgres", //username
"postgres", //password
{
host: "localhost",
dialect: "postgres",
// operatorsAliases: false,
opertorsAliases:{
$or:Op.or
},
pool: {
max: 5,
min: 0,
require: 30000,
idle: 1000
},
define: {
freezeTableName: true
}
}
);
// define model/table
const models = {
Employee: sequelize.define("../model/employee"),
User:sequelize.define("../model/user")
};
//relations
models.Employee.hasMany(models.User);
models.Sequelize = Sequelize;
models.sequelize = sequelize;
module.exports = models;
это мой вывод vs code
enterd get service {}
ERR IS { SequelizeEagerLoadingError: employee is not associated to user!
at Function._getIncludedAssociation (/home/sarath/Desktop/asset/node_modules/sequelize/lib/model.js:711:13)
at Function._validateIncludedElement (/home/sarath/Desktop/asset/node_modules/sequelize/lib/model.js:615:53)
at options.include.options.include.map.include (/home/sarath/Desktop/asset/node_modules/sequelize/lib/model.js:511:37)
at Array.map (<anonymous>)
at Function._validateIncludedElements (/home/sarath/Desktop/asset/node_modules/sequelize/lib/model.js:506:39)
at Promise.try.then.then (/home/sarath/Desktop/asset/node_modules/sequelize/lib/model.js:1711:14)
at tryCatcher (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/promise.js:512:31)
at Promise._settlePromise (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/promise.js:569:18)
at Promise._settlePromise0 (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/promise.js:614:10)
at Promise._settlePromises (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/promise.js:694:18)
at _drainQueueStep (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/async.js:138:12)
at _drainQueue (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/async.js:131:9)
at Async._drainQueues (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/async.js:147:5)
at Immediate.Async.drainQueues [as _onImmediate] (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/async.js:17:14)
at processImmediate (timers.js:632:19) name: 'SequelizeEagerLoadingError' }
GET /abc/users 200 20.215 ms - 57
Ответ №1:
я думаю, вам может быть проще, если вы объявите свои ассоциации в своих классах в соответствии с документацией.. но вам придется добавить кое-что, чтобы заставить его работать..
Я действительно не понимаю, почему между сотрудником и пользователем может быть много отношений, в ваших моделях нет ничего, что указывало бы на это… Ваши модели предполагают, что пользователь принадлежит сотруднику, а у сотрудника есть один пользователь, но поскольку это не идентификатор внешнего ключа, вам нужно будет указать sequelize, какие ключи использовать для создания ассоциации…
Может быть, что-то вроде
module.exports = function (sequelize, DataTypes) {
const Employee = sequelize.define('employee', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
username: {
type: Sequelize.STRING,
},
password: {
type: Sequelize.STRING
},
employeename:{
type:Sequelize.STRING
},
},
}, {
freezeTableName: true,
tableName: 'employee',
});
Employee.associate = function (models) {
models.Employee.hasOne(models.User, { as: 'Employee', foreignKey: 'username', sourceKey: 'username' });
};
return Employee;
};
module.exports = function (sequelize, DataTypes) {
const User = sequelize.define('user', {
id:{
type:Sequelize.INTEGER, //crete columns
autoIncrement:true,
primaryKey:true
},
username:{
type:Sequelize.STRING
},
email:{
type:Sequelize.STRING
}
},
}, {
freezeTableName: true,
tableName: 'user',
});
User.associate = function (models) {
models.User.belongsTo(models.Employee, { as: 'User', foreignKey: 'username', sourceKey: 'username' });
};
return User;
};
и затем, где вы это сделали: вам нужно добавить часть, которой вам не хватало
// define model/table
const models = {
Employee: sequelize.import('../model/employee'),
User:sequelize.import('../model/user')
};
//You were missing this
Object.keys(models).forEach((modelName) => {
if ('associate' in models[modelName]) {
// console.log(models[modelName]);
models[modelName].associate(models);
}
});
models.Sequelize = Sequelize;
models.sequelize = sequelize;
Я сомневаюсь, что вы можете скопировать и вставить это и заставить его работать без нескольких исправлений, поскольку я только что ввел его здесь и не проверял в VSCode, но в этом суть..
Комментарии:
1. ОШИБКА РАВНА { SequelizeEagerLoadingError: сотрудник не связан с пользователем! в функции. _getIncludedAssociation
2. Объект.ключи (модели). forEach((Employee) => { if (‘associate’ в моделях[User]) { // console.log(модели[имямоДели]); модели[Employee].associate(это. Пользователь); } });
3. }); User.associate = функция (модели) { models.User.belongsTo(модели. Employee, { как: ‘User’, ForeignKey: ‘username’, sourceKey: ‘username’ }); }; module.exports = User; //экспортировать таблицу
4. Employee.associate = функция (модели) { модели. Сотрудник. Принадлежит (моделям. Пользователь, { как: ‘Employee’, ForeignKey: ‘username’, sourceKey: ‘username’ }); }; module.exports = Employee;
5. Это не сработает, вам придется пересмотреть то, что я сказал, и следить более внимательно… у вас есть несколько отношений belongsTo, а не отношения hasOne и belongsTo, которые я опубликовал выше… Также вы не должны публиковать код в комментариях… Вы должны опубликовать его полностью в правильно отформатированном ответе, так вам будет легче помочь! Просто опубликуйте другой ответ на вопрос с внесенными вами обновлениями или вернитесь и отредактируйте свой первый вопрос с внесенными вами изменениями, и я прочитаю его там