我在发送更新请求时收到SequelizeDatabaseError Data truncated for column 'position' at row 4
,如下所示: 关于如何修复数据库错误的任何建议?
正在执行(默认(:更新user
设置photo
=?,name
=?,email
=?,phonenumber
=?,position
=?,password
=?,updatedAt
=?其中email
= ? SequelizeDatabaseError:第 4 行"位置"列的数据被截断 at Query.formatError (C:\Project\soccerpepode_modules\sequelize\lib\dialects\mysql\query.js:244:16( at Execute.handler [as onResult] (C:\Project\soccerpepode_modules\sequelize\lib\dialects\mysql\query.js:51:23(
module.exports = function(sequelize, DataTypes) {
return sequelize.define('user', {
name: {
type: DataTypes.STRING(30),
allowNull: false
},
email: {
type: DataTypes.STRING(100),
allowNull: false
},
phonenumber: {
type: DataTypes.STRING(50),
},
id: {
type: DataTypes.INTEGER(10).UNSIGNED,
allowNull: false,
primaryKey: true,
autoIncrement: true
},
password: {
type: DataTypes.STRING(50),
allowNull: false
},
privilege: {
type: DataTypes.ENUM('PLAYER','ADMIN'),
},
photo: {
type: DataTypes.STRING(30),
},
position: {
type: DataTypes.ENUM('FORWARD','MID-FIELD','DEFENDER','GK'),
}
}, {
tableName: 'user'
});
};
server.js
const UserModel = userSchema(sequelize, DataTypes);
app.put('/service/profile', async (req, res, next) => {
try {
const userEmail = req.query.email;
var selector = {
where: { email: userEmail }
};
const updatePlayer = await UserModel.update(req.body, selector);
console.log("Server side update method log:" + updatePlayer);
res.status(200).json({ success: true });
} catch (err) {
return next(err);
}
});
我认为问题出在 ENUM 上,您只能将其用于Postgres
而不是mysql
, (Ref(
position: {
type: DataTypes.ENUM('FORWARD','MID-FIELD','DEFENDER','GK'),
}
将其更改为简单string
类型并再次检查,
position: {
type: DataTypes.STRING(30)
}
注意:您可能需要再次创建表或更新字段 在模型中更改此设置后手动执行此操作,否则您仍将获得 错误
更改数据类型不是解决方案。您必须检查尝试保存的数据。例如:如果 ENUM("0", "1"( 并且您尝试保存数据 0,则它会显示这种类型的错误。您必须像"0"一样保存。然后它不会再次显示这种类型的错误消息。
如果你想在mysql中使用ENUM,你应该这样使用它
position: {
type: DataTypes.ENUM,
values: ['player', 'admin],
defaultValue: 'monthly' // A default value just incase you fail to provide one...
},
我希望这有帮助...
我花了很多时间来追踪这个错误。
我有以下所有解决方案,但不起作用。
就我而言,我的坏是... 我忘记了有保存新旧数据的克隆表/复制/历史记录/触发器。
确保您的历史记录表具有相同的数据类型。 我有这样的桌子
form3
hs_form3 // its mean history with revision (number of revisi data) column and action column (create/update/delete/any)
仅供描述
CREATE TABLE hs_form3 LIKE form3;
ALTER TABLE hs_form3 MODIFY COLUMN id int(11) NOT NULL,
DROP PRIMARY KEY, ENGINE = InnoDB, ADD action VARCHAR(8) DEFAULT 'insert' FIRST,
ADD revision INT(6) NOT NULL AUTO_INCREMENT AFTER action,
ADD dt_datetime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER revision,
ADD PRIMARY KEY (revision),
ADD KEY `user_id` (`user_id`),
而且我没有在服务器上运行迁移,因为很多变化,我只在本地主机上运行。 在服务器中,我只是通过导出导入或添加手动放置了一个新表。 在我遇到有关服务器上迁移的问题并且没有捕获SQL表中的上次更改并且没有时间解决之前。