首页 > 解决方案 > 尽管将字段的类型设置为 Float,但仍期望 Integer

问题描述

我有一个模型如下:

const Sequelize = require("sequelize");
const sequelize = new Sequelize({
  database: process.env.PGDATABASE,
  username: process.env.PGUSER,
  password: process.env.PGPASS,
  host: process.env.PGHOST,
  port: process.env.PGPORT,
  dialect: "postgres"
});

var MessageRating = sequelize.define(
  "MessageRating",
  {
    chatId: {
      type: Sequelize.STRING,
      primaryKey: true,
      allowNull: false
    },
    ratingType: {
      type: Sequelize.ENUM,
      values: ["NEGATIVE", "POSITIVE", "NEUTRAL", "MIXED"],
      allowNull: false
    },
    rating: {
      type: Sequelize.FLOAT,
      allowNull: false
    }
  },
  {
    indexes: [
      {
        unique: false,
        fields: ["ratingType"]
      }
    ]
  }
);

module.exports = MessageRating;

我正在尝试使用以下代码使用此模型创建一个表:

 var messageRatingStored = sequelize
          .sync()
          .then(() =>
            MessageRating.create({
              chatId: chatId,
              ratingType: amazonComprehendResult.ResultList[0].Sentiment,
              rating: roundOffRating
            })
          )
          .then(messageRating => {
            console.log("MessageRating json", messageRating.toJSON());
          });

每当我运行代码时,它都会抛出错误:“未处理的拒绝 SequelizeDatabaseError:整数的无效输入语法:“0.82””

https://gist.github.com/BikalNepal/51fd28f877b422fcc16825d61cd95847

我尝试使用静态整数值(82、10 等)而不是“roundOffRating”(给出十进制),它可以完美地存储而没有错误。由于我没有使用整数作为模型中的评分类型,为什么它仍然需要整数?

标签: javascriptpostgresqlsequelize.js

解决方案


您更新了 Sequelize 模型,但您是否更新了数据库表本身?

仅使用sequelize.sync()会创建缺失的表。它不会更新现有的。Usingsequelize.sync({force: true})将删除所有表并重新创建它们,这意味着您的字段实际上是一个浮点数,但您将丢失数据库中存在的所有数据。

您可以使用以下 alter 语句更新数据库中的字段,而不会丢失数据:

ALTER TABLE MessageRating ALTER COLUMN rating TYPE float;

阅读更多关于ALTER TABLE的信息。

一个有用的提示: Sequelize 将数据库中的错误作为SequelizeDatabaseError错误传播。当您看到这种类型的错误来自您的代码时,您可以确定该错误来自数据库而不是本身。


推荐阅读