使用原始查询从MySQL数据库检索数据时遇到一些麻烦。 问题是原始数据与sequelize中定义的模型实例之间的映射。 特别是那些在数据库中强调了名称并在模型中加入了名称的字段。
我以这种方式定义了商店模型:
sequelize.define('stores', {
id: {
type: DataTypes.INTEGER(11),
allowNull: false,
primaryKey: true,
autoIncrement: true
},
...
postalCode: {
type: DataTypes.STRING,
field: 'postal_code',
},
...
}
我使用以下代码从数据库中的例程中获取数据:
sequelize.query('CALL get_stores()', {model: Stores, type: sequelize.QueryTypes.RAW}).then(function (stores) {
console.log(stores);
}
根据文档(http://docs.sequelizejs.com/en/latest/docs/raw-queries/)如果我定义选项“model”,该函数将返回Store实例而不是原始数据。 但事实并非如此,对于模型和数据库中名称不同的所有字段(请参阅postalCode - > postal_code),我得到的响应返回一个带有数据库字段名称(postal_code)的对象,而不是那些在模型(postalCode)。
我已经尝试过使用QueryTypes.SELECT而不是QueryTypes.RAW但没有成功。
请注意,使用findAll或findOne方法时没有问题。
答案 0 :(得分:3)
您可以在查询中设置选项mapToModel: true
,以指示Sequelize将返回的字段名称转换为您提供的模型中的等效名称。
const User = sequelize.define('user', {
userId: {
field: 'user_id',
type: DataTypes.BIGINT,
primaryKey: true
})
sequelize.query(
'select user_id from user where user_id > 1000',
{
mapToModel: true,
model: User
}
)
此功能已包含在参考文档中: http://docs.sequelizejs.com/class/lib/sequelize.js~Sequelize.html#instance-method-query