为什么Sequelize会为SELECT查询添加额外的列?

时间:2018-03-22 08:43:38

标签: node.js sequelize.js

当我想从引用的表中获取一些连接数据的记录时,Sequelize会将参考列添加两次:正常的列和它们的副本,只是略有不同。

这是我的模特:

module.exports = function(sequelize, DataTypes) {
return sequelize.define('result', {
id: {
  type: DataTypes.INTEGER(10),
  allowNull: false,
  primaryKey: true,
  autoIncrement: true
},
test_id: {
  type: DataTypes.INTEGER(10),
  allowNull: false,
  references: {
    model: 'test',
    key: 'id'
  }
},
item_id: {
  type: DataTypes.INTEGER(10),
  allowNull: false,
  references: {
    model: 'item',
    key: 'id'
    }
 },
}, // and many other fields
{
tableName: 'result',
timestamps: false, // disable the automatic adding of createdAt and    updatedAt columns
underscored:true
});
}

在我的存储库中,我有一个方法,它通过连接数据获取结果。我定义了以下关联:

const Result = connection.import('../../models/storage/result');
const Item = connection.import('../../models/storage/item');
const Test = connection.import('../../models/storage/test');

Result.belongsTo(Test, {foreignKey: 'test_id'});
Test.hasOne(Result);

Result.belongsTo(Item, {foreignKey: 'item_id'});
Item.hasOne(Result);

// Defining includes for JOIN querys
var include = [{
model: Item,
attributes: ['id', 'header_en']
}, {
model: Test,
attributes: ['label']
}];

var getResult = function(id) {

    return new Promise((resolve, reject) => { // pass result
        Result.findOne({
            where: { id : id },
            include: include,
        //     attributes: ['id',
        // 'test_id',
        // 'item_id',
        // 'result',
        // 'validation'
        // ]
        }).then(result => {
            resolve(result);
            });
    }); 
}

该函数产生以下查询:

SELECT `result`.`id`, `result`.`test_id`, `result`.`item_id`,  `result`.`result`, `result`.`validation`, `result`.`testId`, `result`.`itemId`, `item`.`id` AS `item.id`, `item`.`title` AS `item.title`, `test`.`id` AS `test.id`, `test`.`label` AS `test.label` FROM `result` AS `result` LEFT OUTER JOIN `item` AS `item` ON `result`.`item_id` = `item`.`id` LEFT OUTER JOIN `test` AS `test` ON `result`.`test_id` = `test`.`id` WHERE `result`.`id` = '1';

注意要从结果表中选择的额外itemId,testId。我不知道这发生了什么。这会产生:

Unhandled rejection SequelizeDatabaseError: Unknown column 'result.testId' in 'field list'

仅在我指定要选择的属性时才有效。

编辑:我的数据库中的表已经引用了包含item_id和test_id的其他表。那么就像我一样在应用程序代码中再次添加关联吗?

结果总是有一个项目并且测试它属于。

我该如何解决这个问题?

提前致谢,

麦克

2 个答案:

答案 0 :(得分:1)

Sequelize默认情况下通过在模型名称中添加id来使用这些列名。如果要停止它,则需要指定一个选项。

underscored: true

您可以在应用程序级别和模型级别指定此属性。

此外,您还可以关闭时间戳。您需要使用时间戳选项。

timestamps: false

答案 1 :(得分:1)

<强> SOLUTION:

Result.belongsTo(Test, {foreignKey: 'test_id'});
// Test.hasMany(Result);

Result.belongsTo(Item, {foreignKey: 'item_id'});
// Item.hasOne(Result);

注释掉hasOne,hasMany行确实解决了这个问题。我想通过两次定义关联来搞砸了它。 :|