Sequelize:原始数据和模型之间的映射

时间:2016-09-11 10:51:49

标签: node.js sequelize.js

使用原始查询从MySQL数据库检索数据时遇到一些麻烦。 问题是原始数据与sequ​​elize中定义的模型实例之间的映射。 特别是那些在数据库中强调了名称并在模型中加入了名称的字段。

我以这种方式定义了商店模型:

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方法时没有问题。

1 个答案:

答案 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