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

ema*_*sco 4 node.js sequelize.js

我在使用原始查询从 MySQL 数据库中检索数据时遇到了一些麻烦。问题在于原始数据和 sequelize 中定义的模型实例之间的映射。特别是那些在数据库中带有下划线名称并在模型中使用驼峰格式的字段。

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

sequelize.define('stores', {
    id: {
        type: DataTypes.INTEGER(11),
        allowNull: false,
        primaryKey: true,
        autoIncrement: true
    },
    ...
    postalCode: {
        type: DataTypes.STRING,
        field: 'postal_code',
    },
    ...
}
Run Code Online (Sandbox Code Playgroud)

我使用以下代码从数据库中的例程中获取数据:

sequelize.query('CALL get_stores()', {model: Stores, type: sequelize.QueryTypes.RAW}).then(function (stores) {
    console.log(stores);
}
Run Code Online (Sandbox Code Playgroud)

根据文档(http://docs.sequelizejs.com/en/latest/docs/raw-queries/),如果我定义了“模型”选项,该函数将返回 Store 的一个实例而不是原始数据。但这不是真的,对于模型和数据库中名称不同的所有字段(请参阅 postalCode -> postal_code),我得到的响应返回一个带有数据库字段名称(postal_code)的对象,而不是在模型(邮政编码)。

我已经尝试使用 QueryTypes.SELECT 而不是 QueryTypes.RAW 但没有成功。

请注意,使用 findAll 或 findOne 方法时没有问题。

Eri*_*pie 6

您可以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
  }
)
Run Code Online (Sandbox Code Playgroud)

此功能隐藏在参考文档中:http : //docs.sequelizejs.com/class/lib/sequelize.js~Sequelize.html#instance-method-query