javascript - 续集如何将日期格式化为 YYYY-MM-DD HH:mm:ss 并将列保持为蛇形
问题描述
嗨,我正在使用带有 Postgres 数据库的 Sequelize
所以我试图在续集 createdAt 和 updatedAt 列上格式化日期以及YYYY-MM-DD HH:mm:ss
将列保持为snake_case而不是camelcase,这样它们就可以了created_at
,updated_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 在这里不起作用,它是一个网络存档
https://web.archive.org/web/20200731154157/http://sequelize.org/master/index.html
解决方案
据我了解,您的问题包含一些子问题:
- Sequelize 表列下划线名称;
- 续集日期格式;
- 无片刻使用;
这是我刚刚得到的一些工作示例(具有上述要求):
像这样进行后续迁移:
'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'
});
};
不要忘记根据需要重命名表名,这里是“项目”。
似乎在 github 上发布了一个带有 sequelize "underscored" 属性的问题。无论如何它对我有用,因为其他属性有一个小技巧,所以就这样做,我相信它应该工作(我的 Sequelize 版本是“^5.22.3”)。
我用过的来源:
- 带/不带 Moment.js 的日期格式
- JavaScript 日期 toLocaleString()
- 如何格式化 JavaScript 日期
- Javascript 添加前导零至今
- 如何在不显示秒数的情况下使用 .toLocaleTimeString()?
如果需要,请随意编辑和优化(我在 get() 方法中进行了一些小的编辑以获得所需的确切格式,无论如何我更喜欢使用 moment 作为列访问器)。
推荐阅读
- android - 如何从自定义视图访问主机片段的生命周期范围?
- php - 多个 setcookie() 调用产生 502 错误
- python - 如何将函数应用于数组中的每个 3d 矩阵?
- ios - Firebase 是否仍将版本更新计为 first_open 事件?
- c# - 使用 SSL 到 KDPW 设置 .Net IBM.XMS 客户端
- spring - 使用 resteasy 3.0.8 和 spring boot 1.2.6 进行分段上传
- google-analytics - 如何在 Google Analytics(分析)> 行为 > 事件中按用户 ID 排除数据?
- python - 标签按钮在纹理之外是可点击的
- css - 将 wordpress 网站从 2 列更改为只有 1 列
- python - kivy 'NoneType' 对象没有属性 'get_screen'?如何从不同的屏幕访问值?