Sequelize is probably the most popular ORM for Express. It helped me to quickly start with a NodeJS server and a Postgres database in my current side project.
Unfortunately I encountered a strange issue when I wanted to introduce decimal numbers to one of my models.
Sequelize in version 5.21.3 has an error with decimal type.
My model looked like this:
module.exports = (sequelize, DataTypes) => { const incomeExpense = sequelize.define( 'incomeExpense', { id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true }, value: DataTypes.DECIMAL(10, 2), description: DataTypes.STRING, date: DataTypes.DATEONLY, type: DataTypes.STRING }, { freezeTableName: true } ); incomeExpense.associate = function(db) { incomeExpense.belongsTo(db.stage); }; return incomeExpense; };
Data in Postgres:
id | value | description | date | type | stageId |
---|---|---|---|---|---|
6 | 120.00 | invoice 1 | 2019-11-11 | income | 3 |
7 | 120.33 | invoice 2 | 2019-11-11 | income | 3 |
JSON response:
[ { "id": 6, "value": "120.00", "description": "invoice 1", "date": "2019-11-11", "type": "income", "createdAt": "2019-11-10T23:00:00.000Z", "updatedAt": "2019-11-10T23:00:00.000Z", "stageId": 3 }, { "id": 7, "value": "120.33", "description": "invoice 2", "date": "2019-11-11", "type": "income", "createdAt": "2020-02-06T16:41:36.868Z", "updatedAt": "2020-02-06T16:41:36.868Z", "stageId": 3 } ]
The returned value
is a string type.
I thought that the conversion from a number to a string heppens somewhere in Node or React. As it turns out, it is the model itself.
Model after changing the value
to DataTypes.FLOAT
:
module.exports = (sequelize, DataTypes) => { const incomeExpense = sequelize.define( 'incomeExpense', { id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true }, // value: DataTypes.DECIMAL(10, 2), value: DataTypes.FLOAT, description: DataTypes.STRING, date: DataTypes.DATEONLY, type: DataTypes.STRING }, { freezeTableName: true } ); incomeExpense.associate = function(db) { // associations can be defined here incomeExpense.belongsTo(db.stage); }; return incomeExpense; };
Postgres dropped the trailing zeros:
id | value | description | date | type | stageId |
---|---|---|---|---|---|
6 | 120 | invoice 1 | 2019-11-11 | income | 3 |
7 | 120.33 | invoice 2 | 2019-11-11 | income | 3 |
And now the value
in response is a number:
[ { "id": 6, "value": 120, "description": "invoice 1", "date": "2019-11-11", "type": "income", "createdAt": "2019-11-10T23:00:00.000Z", "updatedAt": "2019-11-10T23:00:00.000Z", "stageId": 3 }, { "id": 7, "value": 120.33, "description": "invoice 2", "date": "2019-11-11", "type": "income", "createdAt": "2020-02-06T16:41:36.868Z", "updatedAt": "2020-02-06T16:41:36.868Z", "stageId": 3 } ]
This issue is opened, and there is an ongoing discussion:
link
For now, I can't think of a better fix than Changing a DECIMAL
to a FLOAT
.
Top comments (0)