Sequelize如何将日期格式设置为YYYY-MM-DD HH:mm:ss并将列保持蛇形大小写 &



您好,我正在使用Sequelize与Postgres数据库

所以我试图格式化日期上的序列createdAt和updatedAt列作为YYYY-MM-DD HH:mm:ss以及保持列snake_case不是camelcase,所以他们将是created_atupdated_at我怎么能做到这一点?我尝试了以下操作:

createdAt: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: moment.utc().format('YYYY-MM-DD HH:mm:ss'),
field: 'created_at'
},

createdAt: {
type: DataTypes.DATE,
defaultValue: sequelize.NOW,
set(value) {
return value.toISOString().replace(/..+/g, '')
// coming in the db as 2021-10-31 01:34:48.81+00 so wanted to remove evrything after the dot
},
name: 'createdAt',
field: 'created_at',
},

不工作,我得到这个错误

throw new Error(`Value for "${key}" option must be a string or a boolean, got ${typeof this.options[key]}`);
^
Error: Value for "createdAt" option must be a string or a boolean, got object

这是上面定义的整个表,我已经确定了我需要帮助的

const Supplier = sequelize.define('Supplier', {
id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
allowNull: false,
primaryKey: true
},
name: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
validate: {
len: [1, 50]
}
},
description: {
type: DataTypes.STRING,
allowNull: true,
},
}, {
tableName: 'suppliers',
timestamps: true,
createdAt: {
type: DataTypes.DATE,
defaultValue: sequelize.NOW,
set(value) {
return value.toISOString().replace(/..+/g, '')
},
name: 'createdAt',
field: 'created_at',
},
updatedAt: {
type: DataTypes.DATE,
defaultValue: sequelize.NOW,
set(value) {
return value.toISOString().replace(/..+/g, '')
},
field: 'updated_at',
},
// freezeTableName: true
// paranoid: true
});

感谢今天Sequelize docs不工作,这里是一个webchive的

https://web.archive.org/web/20200731154157/http://sequelize.org/master/index.html

我理解你的问题包含了一些子问题:

  • 序列化表列下划线名称;
  • 序列化日期格式;
  • 无力矩使用;

以下是我刚刚得到的一些工作示例(具有上述要求):

有一个像这样的序列化迁移:

'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('items', {
// ...
created_at: {
allowNull: false,
type: Sequelize.DATE
},
// ...
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('items');
}
};

有一个像这样的序列化模型:

'use strict';
// WITH moment
// const moment = require('moment');
module.exports = (sequelize, DataTypes) => {
// const now = new Date();
return sequelize.define('Item', {
// ...
created_at: {
allowNull: false,
// defaultValue: now,
type: DataTypes.DATE,
get() {
// 1. WITHOUT moment
const date = new Date(`${this.dataValues.created_at}`);
return `${date.toISOString().split('T')[0]} ${date.toLocaleTimeString([], {month: '2-digit', timeStyle: 'medium', hour12: false})}`;

// 2. WITHOUT moment (another solution)
// const parts = date.toISOString().split('T');
// return `${parts[0]} ${parts[1].substring(0, 8)}`;

// 3. WITH moment
// return moment(this.dataValues.created_at).format('D MM YYYY HH:mm:ss'); // 'D MMM YYYY, LT'
}
},
// ...
}, {
tableName: 'items',
freezeTableName: true,
// underscored: true,
timestamps: false,
charset: 'utf8',
collate: 'utf8_general_ci'
});
};

别忘了根据你的需要重命名你的表名,这里是"items"

似乎有一个问题发布在github与sequelize "下划线"财产。无论如何,它对我来说是有效的,因为有一个小技巧与其他属性,所以只要这样做,我相信它应该工作(Sequelize版本对我来说是"^5.22.3")。

我使用过的来源:

  • date format with/without Moment.js
  • JavaScript日期toLocaleString()
  • 如何格式化JavaScript日期
  • Javascript添加日期前导零
  • 我如何使用。tolocaletimestring()不显示秒?

如果需要,可以随意编辑和优化(我在get()方法中做了一些小编辑,以获得您想要的确切格式,无论如何,我更喜欢使用moment作为列访问器)。

解决方案

如上所述,get()方法只会将格式化后的值返回给客户端,但是它不会将其保存到数据库中。我找到了三个选项,使其保存到数据库,因此解决这个问题的人遇到类似的事情。

1。第一个选项

node_modules/sequelize/lib/data-types.js

我们必须修改以下代码

DATE.prototype._stringify = function _stringify(date, options) {
date = this._applyTimezone(date, options);
// Z here means current timezone, _not_ UTC
// return date.format('YYYY-MM-DD HH:mm:ss.SSS Z');// from this to the below code
return date.format('YYYY-MM-DD HH:mm:ss.SSS'); // to this
};

2。第二个选择

如果你不想碰你的node_modules文件夹,并且不喜欢选项1,那么一个更好的解决方案是在你自己的db.js文件中执行选项1:

const { Sequelize } = require('sequelize');
const { DB } = require('../config');
// Override timezone formatting by requiring the Sequelize and doing it here instead
Sequelize.DATE.prototype._stringify = function _stringify(date, options) {
date = this._applyTimezone(date, options);
// Z here means current timezone, _not_ UTC
// return date.format('YYYY-MM-DD HH:mm:ss.SSS Z');
return date.format('YYYY-MM-DD HH:mm:ss Z');
};
const db = new Sequelize(`${DB.DIALECT}://${DB.USER}:${DB.PASS}@${DB.HOST}:${DB.PORT}/${DB.DB}`, {
logging: false
})
module.exports = db;

所以这两个选项更像是全局的方式,所以格式将适用于所有模型。

3。第三种选择

最后一个选项是使用hooks

为每个模型执行此操作的例子:

const Supplier = sequelize.define('Supplier', {
// col attributes 
}, {
tableName: 'suppliers',
timestamps: true,
createdAt: 'created_at',
updatedAt: 'updated_at',
hooks : {
beforeCreate : (record, options) => {
record.dataValues.created_at = new Date().toISOString().replace(/T/, ' ').replace(/..+/g, '');
record.dataValues.updated_at = new Date().toISOString().replace(/T/, ' ').replace(/..+/g, '');
},
beforeUpdate : (record, options) => {
record.dataValues.updated_at = new Date().toISOString().replace(/T/, ' ').replace(/..+/g, '');
}
},
})

相关内容

  • 没有找到相关文章

最新更新