javascript - 尽管将字段的类型设置为 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”(给出十进制),它可以完美地存储而没有错误。由于我没有使用整数作为模型中的评分类型,为什么它仍然需要整数?
解决方案
您更新了 Sequelize 模型,但您是否更新了数据库表本身?
仅使用sequelize.sync()
会创建缺失的表。它不会更新现有的。Usingsequelize.sync({force: true})
将删除所有表并重新创建它们,这意味着您的字段实际上是一个浮点数,但您将丢失数据库中存在的所有数据。
您可以使用以下 alter 语句更新数据库中的字段,而不会丢失数据:
ALTER TABLE MessageRating ALTER COLUMN rating TYPE float;
阅读更多关于ALTER TABLE的信息。
一个有用的提示: Sequelize 将数据库中的错误作为SequelizeDatabaseError
错误传播。当您看到这种类型的错误来自您的代码时,您可以确定该错误来自数据库而不是本身。
推荐阅读
- android - 我可以从 Android/iOS 设备每 5 秒广播一次蓝牙低功耗 20 KB 数据吗?
- angular - 来自组件的 NGRX 顺序调用操作
- javascript - 异步回调返回值
- python-3.x - 如何访问给定的 xpath 结果?
- c# - 使用列表中的列表的 Lambda 方法查询语法
- kotlin - 如何使用从 application.properties 中获取的值初始化伴随对象属性?
- asp.net-core-3.1 - 如何从 Startup.CS 查询数据库
- android - 如何使用 ktor 库和 kotlin 下载 .apk?
- javascript - 循环对象对象并在找到特定值时中断
- python - 为什么这个递归函数只在类中实例化变量时才起作用?