如何在node.js

时间:2016-07-06 20:38:44

标签: javascript node.js postgresql sequelize.js

我正在尝试通过sequelize执行查询。我有4个表: userInfo (包含外键(“group_id”)), group_user (包含有关用户组的信息),权限(其中包含有关权限的信息),最后是连接表 group_privileges (在表group_user和权限上有2个外键)

模型定义

userInfo.js中定义的模型

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('userInfo', {
    username: {
      type: DataTypes.TEXT,
      allowNull: true
    },
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true
    },
    group_id: {
      type: DataTypes.INTEGER,
      allowNull: true,
      defaultValue: '1',
      references: {
        model: 'group_user',
        key: 'id'
      }
    }
  }, {
    tableName: 'userInfo',
    underscored: true,
    freezeTableName: true,
  });
};

group_privilege.js中定义的模型

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('group_privilege', {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true
    },
    group_id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      references: {
        model: 'group_user',
        key: 'id'
      }
    },
    privilege_id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      references: {
        model: 'privilege',
        key: 'id'
      }
    }
  }, {
    tableName: 'group_privilege',
    underscored: true,
    freezeTableName: true,
  });
};

group_user.js中定义的模型

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('group_user', {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true
    },
    name: {
      type: DataTypes.TEXT,
      allowNull: true
    },
    description: {
      type: DataTypes.TEXT,
      allowNull: true
    }
  }, {
    tableName: 'group_user',
    underscored: true,
    freezeTableName: true,
  });
};

在privilege.js中定义的模型

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('privilege', {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true
    },
    description: {
      type: DataTypes.TEXT,
      allowNull: true
    },
    code: {
      type: DataTypes.TEXT,
      allowNull: false,
      defaultValue: 'N/D'
    }
  }, {
    tableName: 'privilege',
    underscored: true,
    freezeTableName: true,
  });
};

以下是我执行查询的代码

var privilege = Mysequelize.import(path.join(process.cwd() + "/models/privilege.js"));
var group_privilege = Mysequelize.import(path.join(process.cwd() + "/models/group_privilege.js"));
var userInfo = Mysequelize.import(path.join(process.cwd() + "/models/userInfo.js"));
var group_user = Mysequelize.import(path.join(process.cwd() + "/models/group_user.js"));

group_privilege.belongsTo(privilege, {foreignKey:'privilege_id', targetKey:"id"});
privilege.hasMany(group_privilege, {foreignKey:'privilege_id', targetKey:"id"});

userInfo.belongsTo(group_privilege, {foreignKey:'group_id', targetKey:'group_id'});
group_privilege.hasOne(userInfo, {foreignKey:'group_id', targetKey:'group_id'});                

Mysequelize.sync().then(function(){            
   privilege.findAll({include:[{model:group_privilege, include:{model:userInfo, where: id:req.user.id}}}]}).then(function(final_priv){
     var list_of_privileges = [];
     for (var key in final_priv){
        list_of_privileges.push(final_priv[key].dataValues.id);
     }
     res.type('application/json').status(200).send({"userPrivileges":list_of_privileges});                
        }).catch(function(err){
          return next(err)});
    }).catch(function(err){
      var errMsg = "Error while getting user privileges in database: " + err; 
      console.log(errMsg);
       res.status(500).send(errMsg);
    });
}).catch(function(err){
  return next('Unable to connect to the database:' + err);
});

我期望发生什么?

理想的输出查询是:

SELECT "privilege"."id", 
       "privilege"."description", 
       "privilege"."code"
FROM "privilege" AS "privilege" 
INNER JOIN "group_privilege" AS "group_privileges" ON "privilege"."id" = "group_privileges"."privilege_id" 
INNER JOIN "userInfo" AS "group_privileges.userInfos" ON "group_privileges"."group_id" = "group_privileges.userInfos"."group_id"
WHERE "group_privileges.userInfos".id = 15;
  

请注意,在WHERE条件中,数字15只是一个动态ID   数。我们不需要关注这个价值。

实际发生了什么?

启用日志记录选项时,我们可以看到执行的SQL查询是:

SELECT "privilege"."id", 
    "privilege"."description", 
    "privilege"."code", 
    "group_privileges"."id" AS "group_privileges.id", 
    "group_privileges"."group_id" AS "group_privileges.group_id", 
    "group_privileges"."privilege_id" AS "group_privileges.privilege_id", 
    "group_privileges.userInfos"."username" AS "group_privileges.userInfos.username", 
    "group_privileges.userInfos"."id" AS "group_privileges.userInfos.id", 
    "group_privileges.userInfos"."group_id" AS "group_privileges.userInfos.group_id" 
FROM "privilege" AS "privilege" 
LEFT OUTER JOIN "group_privilege" AS "group_privileges" ON "privilege"."id" = "group_privileges"."privilege_id" 
INNER JOIN "userInfo" AS "group_privileges.userInfos" ON "group_privileges"."id" = "group_privileges.userInfos"."group_id" AND "group_privileges.userInfos"."id" = 15;

我的问题是最后一次加入。而不是:

INNER JOIN "userInfo" AS "group_privileges.userInfos" ON "group_privileges"."group_id" = "group_privileges.userInfos"."group_id" AND "group_privileges.userInfos"."id" = 15;

我有

INNER JOIN "userInfo" AS "group_privileges.userInfos" ON "group_privileges"."id" = "group_privileges.userInfos"."group_id" AND "group_privileges.userInfos"."id" = 15;
  

(...这里的问题是:...... ON“group_privileges”。“ id ”...而不是   ... ON“group_privileges”。“ group_id ”)

如您所见,我正在尝试强制group_privileges.userInfos和group_privileges的特定字段的连接条件。但由于我无法弄清楚的原因,它需要将group_privileges表的“ id ”字段改为使用此表的“ group_id ”字段。

有没有人可以告诉我,我做错了什么,或者sequelize模块是否存在问题/错误?如果我做错了什么,你能告诉我究竟是什么以及解决方案是什么?

非常感谢您的回答。

方言:postgres

数据库版本:9.4.4

Sequelize版本:3.23.0

0 个答案:

没有答案