IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Django设置USE_TZ为True后使用mysql查询可能会出现的问题 -> 正文阅读

[Python知识库]Django设置USE_TZ为True后使用mysql查询可能会出现的问题

django项目的settings.py中设置了USE_TZ=True后,不管TIME_ZONE设置的是什么,存入数据库的都是UTC时间,取出来时会转成当前时区的时间来显示。具体USE_TZ的作用在这里就不细说了。

环境说明

Django 3.2.8版本
myql使用的是8.0.25版本
windows10系统

出现的问题

最开始项目中使用的还是sqlite,项目中有个Model类包含了一个DateTimeField,在sqlite时查询是正常的。
下面是示例:

# 查询文章年份为2021年且月份为10月的
Article.objects.filter(post_datetime__year=2021, post_datetime__month=10)

同样的语句,同样的数据,当我迁移到mysql后就出现了上面的语句查询不出数据的情况,如果只查询年份就有结果,但是一旦加上查询月份就没有结果。

解决方法

Queryset中有个query的属性,可以显示查询具体执行了什么sql语句。
具体执行的sql语句:

SELECT `mainapp_article`.`id`, `mainapp_article`.`article_id`, `mainapp_article`.`title`, `mainapp_article`.`content`, `mainapp_article`.`post_datetime`, `mainapp_article`
.`likes`, `mainapp_article`.`category`, `mainapp_article`.`read_count`, `mainapp_article`.`kind_id` FROM `mainapp_article` WHERE (`mainapp_article`.`post_datetime` BETWEEN
 2020-12-31 16:00:00 AND 2021-12-31 15:59:59.999999 AND EXTRACT(MONTH FROM CONVERT_TZ(`mainapp_article`.`post_datetime`, 'UTC', 'Asia/Shanghai')) = 10) ORDER BY `mainapp_a
rticle`.`post_datetime` DESC

其中出问题的是下面这个:

EXTRACT(MONTH FROM CONVERT_TZ(`mainapp_article`.`post_datetime`, 'UTC', 'Asia/Shanghai')) = 10)

Django中的settings.py我将TIME_ZONE设置为了Asia/shanghai,由于USE_TZ的值为True,所以会在查询数据时将数据库中存储的时间由UTC转为Asia/shanghai。DatetimeField对应着mysql里面的datetime类型。
CONVERT_TZ转换时区由以下两种形式:

-- 第一种
SELECT CONVERT_TZ('2021-10-17 13:51:53.777000','Asia/Shanghai','UTC') as cvt;
-- 第二种
SELECT CONVERT_TZ('2021-01-03 12:00:00','+00:00','+10:00')

windows中mysql没有时区表,所以使用第一种方式会导致查询不到数据,添加时区表就可以解决这个查询不到数据的问题了。
加载时区表可以参照这里

当然,直接在Django项目中设置USE_TZ为False也可以解决这个问题

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-11-20 18:21:00  更:2021-11-20 18:22:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:20:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码