【发布时间】:2022-01-26 19:00:53
【问题描述】:
我在 node.js 应用程序和 mysql 中使用 sequelize 作为数据库,但问题是,当我从 MySQL 表中读取数据时,时区读取不正确。
我想使用 IST(Indian Standard Time) 或 'Asia/Calcutta' 作为读取和写入 MySQL 数据库的时区。
我已经尝试过这个Sequelize reads datetime in UTC only 配置但问题得到了部分解决,即仅用于写入数据库。 但是,它在从数据库读取日期时间时仍然存在。
看,下面的配置更好理解。我还附上了从数据库中读取的不正确时区的屏幕截图。
版本详情: "mysql2": "^2.3.0", “续集”:“^6.6.5”
Note: 问题仅在于从数据库中读取 DateTime 而不是用于存储。
Sequelize 模型类:
module.exports = (sequelize, DataTypes) => {
const Invoice = sequelize.define('Invoice', {
invoiceId: {
type: DataTypes.INTEGER.UNSIGNED,
allowNull: false,
autoIncrement: true,
primaryKey: true
},
invoiceNumber: {
type: DataTypes.INTEGER(6).UNSIGNED.ZEROFILL,
allowNull: false,
unique: true
},
description: {
type: DataTypes.TEXT,
allowNull: false
},
discount: {
type: DataTypes.DECIMAL(9,2),
allowNull: false,
defaultValue: 0.00
},
invoiceTotal: {
type: DataTypes.DECIMAL(9,2),
allowNull: false,
defaultValue: 0.00
},
paymentTotal: {
type: DataTypes.DECIMAL(9,2),
allowNull: false,
defaultValue: 0.00
},
invoiceDate: {
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
allowNull: false
}
}, {
underscored: true // will add underscore in field name of database instead of storing camel case notation in db
});
Invoice.associate = function (model) {
Invoice.belongsTo(model.Customer, {
foreignKey: {
name: "cust_id",
allowNull: false
}
});
};
return Invoice;
}
const sequelize = new Sequelize(
config.get('db.database'), // reading from configuration file
config.get('db.user'),
config.get('db.password'), {
host: config.get('db.host'),
dialect: 'mysql',
dialectOptions: {
useUTC: false, //for reading from database
dateStrings: true,
typeCast: function (field, next) { // for reading from database
if (field.type === 'DATETIME') {
return field.string()
}
return next()
},
},
timezone: 'Asia/Calcutta'
});
【问题讨论】:
-
哪个 MySQL 版本?你有populated the database timezones吗? sequelize 使
invoiceDate列 (show create table Invoice) 成为什么数据类型? -
您是否尝试了您链接的问题中发布的所有答案,或者您刚刚尝试了接受的答案?此外,如果您阅读了已接受答案的 cmets,一位用户似乎(可能)有与您类似的问题,其中用户的结论是“将来不要使用 sequelize”......(我不是在暗示你应该放弃尝试通过 sequelize 来实现它)。
-
我的sequelize模型类中
invoiceDate字段的数据类型是DATE,在数据库表中MySQL存储的数据类型是DATETIME。为了帮助您更多,请查看上图数据库中的发票表结构和节点js中的Sequelize Model类。 -
第二个问题的答案,即我是否填充了数据库时区? - 所以,我不知道这一点。你能帮我详细说明一下吗?
-
@FanoFN,是的,我已经尝试了上面链接的问题中发布的几乎所有答案。甚至,我已经阅读了 cmets 并尝试过。是的,我读到了一个用户关于放弃使用 sequelize 的结论,但是如果我们被困在应用程序的中间,我们怎么能放弃呢? - 相反,我认为找到解决方案是一个更好的选择。
标签: mysql node.js database sequelize.js