数据库时间类型数据的处理

简介: 数据库时间类型数据的处理

本篇文章的内容基于 MySQL 和 Sequelize 。



序言



有关时间类型数据的处理其实一直都是一个很让人不爽的地方,在数据库中的存储时间类型默认使用的是 UTC 时间,比我们东八区晚了八个小时,直接使用 UTC 时间显示会让用户摸不着头脑,而如果先取出数据再用 moment 做二次处理显然太麻烦。



Sequelize



Sequelize 是关系型数据库的 ORM ,其作用类似于操作 mongodb 的 mongoose 。


Sequelize 三部分(这里是按我的个人习惯划分)简述:


1、数据库相关宏配置设置,即指定连接的数据库名、操作数据库的用户名和密码,数据库地址,连接池设置等等:


2、数据库中表的定义,这里将表对应为 model :


3、表中具体列的定义,我将其称为 schema,如果你使用过 mongoose 应该很熟悉这个词,但注意这里的 schema 并不是 sequelize 官方文档中的 schema:


以上三个部分及定义了一个完整的数据库结构,数据库操作均可以通过 model 来完成。



问题及解决



言归正传,在上述定义数据库的宏配置时,我们指定了 timezone 为东八区,通过可视化工具如 Navicat 可以看到在数据库中的时间确实是我们想要的,但是查询出来后仍然是 UTC 时间,原因就在于 mysql 数据库和 sequelize 均会对 DATE 类型做处理,timezone 只保证了写入的格式,并没有保证读取的格式。


解决:重新翻了一下 sequelize 的官方文档,发现我们在定义表中列的时候可以设置其 get 和 set 方法,显然这个 get 就是我们想要的,因此重新引入 moment 库对 DATE 类型进行操作:


其实到了这里问题已经基本解决,但是如果你定义了多个表并却其中的列有很多都是 DATE 类型的数据,不断的复制粘贴 get 方法显然不够优雅。



进阶



为了让上述操作更加优雅,我们可以添加一个函数,批量的为 DATE 类型的数据添加 get 方法,但是,大部分情况下时间类型数据的格式为

YYYY-MM-DD HH:mm:ss

可以满足要求,而如果要想指定特殊的时间显示格式呢,显然我们应该允许自定义的 get 方法去设置特殊的时间显示格式。


思路(仍然在定义表中列的时候动手脚):

1、复制原有的所有列定义的对象。

2、遍历每一个表的列

3、在上一步操作内遍历列的每一个数据类型的定义

4、判断 type 类型是都为 DATE,如果是,进一步判断是否已经定义过 get 方法,若已经定义过则不再添加统一的 get 方法,否则添加统一的 get 方法指定统一的时间格式。



结语



解决了一个小问题,完。

目录
相关文章
|
8天前
|
关系型数据库 MySQL 数据库
ORM对mysql数据库中数据进行操作报错解决
ORM对mysql数据库中数据进行操作报错解决
32 2
|
7天前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js实现的在线考试系统。随着在线教育的发展,在线考试系统的重要性日益凸显。该系统不仅能提高教学效率,减轻教师负担,还为学生提供了灵活便捷的考试方式。技术栈包括Spring Boot、Vue.js、Element-UI等,支持多种角色登录,具备考试管理、题库管理、成绩查询等功能。系统采用前后端分离架构,具备高性能和扩展性,未来可进一步优化并引入AI技术提升智能化水平。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
|
9天前
|
Java 关系型数据库 MySQL
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和JSP技术的房屋租赁系统,旨在通过自动化和信息化手段提升房屋管理效率,优化租户体验。系统采用JDK 1.8、Maven 3.6、MySQL 8.0、JSP、Layui和Spring Boot 2.0等技术栈,实现了高效的房源管理和便捷的租户服务。通过该系统,房东可以轻松管理房源,租户可以快速找到合适的住所,双方都能享受数字化带来的便利。未来,系统将持续优化升级,提供更多完善的服务。
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
|
4天前
|
存储 API 数据库
QML使用Sqlite数据库存储ListModel数据
本文介绍了在QML中使用Sqlite数据库存储ListModel数据的方法,包括如何创建数据库、读取数据、动态添加和删除数据,以及如何在程序启动和退出时与数据库同步数据。
|
13天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
阿里云数据库重磅升级!元数据服务OneMeta + OneOps统一管理多模态数据
|
23天前
|
SQL NoSQL Java
彻底革新你的数据库操作体验!Micronaut数据访问技巧让你瞬间爱上代码编写!
【9月更文挑战第10天】Java开发者们一直在寻找简化应用程序与数据库交互的方法。Micronaut作为一个现代框架,提供了多种工具和特性来提升数据访问效率。本文介绍如何使用Micronaut简化数据库操作,并提供具体示例代码。Micronaut支持JPA/Hibernate、SQL及NoSQL(如MongoDB),简化配置并无缝集成。通过定义带有`@Repository`注解的接口,可以实现Spring Data风格的命名查询。
44 6
|
2月前
|
SQL 存储 数据处理
"SQL触发器实战大揭秘:一键解锁数据自动化校验与更新魔法,让数据库管理从此告别繁琐,精准高效不再是梦!"
【8月更文挑战第31天】在数据库管理中,确保数据准确性和一致性至关重要。SQL触发器能自动执行数据校验与更新,显著提升工作效率。本文通过一个员工信息表的例子,详细介绍了如何利用触发器自动设定和校验薪资,确保其符合业务规则。提供的示例代码展示了在插入新记录时如何自动检查并调整薪资,以满足最低标准。这不仅减轻了数据库管理员的负担,还提高了数据处理的准确性和效率。触发器虽强大,但也需谨慎使用,以避免复杂性和性能问题。
34 1
|
2月前
|
安全 关系型数据库 数据库
FastAPI数据库操作秘籍:如何通过高效且安全的数据库访问策略,使你的Web应用飞速运转并保持数据完整性?
【8月更文挑战第31天】在构建现代Web应用时,数据库操作至关重要。FastAPI不仅简化了API创建,还提供了高效数据库交互的方法。本文探讨如何在FastAPI中实现快速、安全的数据处理。FastAPI支持多种数据库,如SQLite、PostgreSQL和MySQL;选择合适的数据库可显著提升性能。通过安装相应驱动并配置连接参数,结合ORM库(如Tortoise-ORM或SQLAlchemy),可以简化数据库操作。使用索引、批量操作及异步处理等最佳实践可进一步提高效率。同时,确保使用参数化查询防止SQL注入,并从环境变量中读取敏感信息以增强安全性。
76 1
|
2月前
|
缓存 运维 监控
打造稳定高效的数据引擎:数据库服务器运维最佳实践全解析
打造稳定高效的数据引擎:数据库服务器运维最佳实践全解析
下一篇
无影云桌面