Django2项目中,如果启用了时区设置,并且使用Mysql数据库时,对Datetime字段进行查询时,可能出现QuerySet数据为空的问题。
这里说一下问题出现与解决的经过。
最近开发的一个项目,在Django中配置了时区。
“settings.py”中相关配置如下:
TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = True
然后,当在项目中对MySQL数据库查询时出现了问题。
查询语句如下:
orders = Order.objects.filter(create_time__day=day)
上面的代码,是想要从数据库中查询出创建时间中的日期部分为某一天的订单数据,但是查询结果的QuerySet是空的。
在Django中我们可以使用“__day”对DateTime字段进行日期匹配,这种匹配规则大家可以参考“Web项目开发入门笔记(8)”。
上面的语句代码并没有问题,那为什么没有正常取得数据呢?
这里要注意一点,Django中保存DateTime字段时,会把本地时间转换为“UTC”类型(国际标准时)后存入数据库。
同样道理,如果在项目使用了指定的时区(例如:’Asia/Shanghai’),在数据库查询时需要进行时区转换。
是Django没有自动转换吗?
很显然不是!
Django的开发人员不会存入数据库的时候做转换,而取出的时候不做转换。
问题出在MySQL。
因为MySQL默认安装后,没有相关的时区表,从而导致无法识别“’Asia/Shanghai’”这样的时区类型。
所以,解决问题的方案就是给MySQL装载时区表。
Linux或Mac系统解决方案:
如果用的是linux或者mac系统,那么在命令行中执行以下命令:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -D mysql -u root -p
然后输入系统密码,从系统中加载时区文件更新到MySQL中。
Windows系统解决方案:
时区支持文件可以到MySQL官方下载。
下载页面:http://dev.mysql.com/downloads/timezones.html
打开下载页面后,我们需要下载的是“timezone_2018e_posix.zip”这个压缩包。
将压缩包解压缩后,复制所有的文件(.frm、.MYD和.MYI文件),粘贴到MySQL安装目录下的“datamysql”目录中,将重复的文件进行替换。
完成以上操作后,重新启动MySQL服务即可。
本文链接:http://so.lmcjl.com/news/2148/