python pymysql peewee關(guān)于時(shí)區(qū)問(wèn)題分析
正文
研究的問(wèn)題:如果我插入一個(gè) datetime 的 tzinfo 北京時(shí)區(qū)的,peewee insert 的時(shí)候,會(huì)幫我轉(zhuǎn)成 utc 再插入嗎?
答案:不會(huì)
研究過(guò)程
我們通過(guò)
- peewee 返回對(duì)的 sql
- peewee 內(nèi)部的 sql
- 以及 wireshark 抓包獲取的 sql
驗(yàn)證判斷
from loguru import logger import settings from peewee import * from datetime import datetime, timedelta, timezone import time import contextlib def get_min_utc_timestamp() -> datetime: return (datetime(year=1970, month=1, day=1) + timedelta(seconds=1)).replace(tzinfo=timezone.utc) def get_utc_now_timestamp() -> datetime: """ https://blog.csdn.net/ball4022/article/details/101670024 """ return datetime.utcnow().replace(tzinfo=timezone.utc) def get_cst_now_timestamp() -> datetime: """ https://segmentfault.com/q/1010000043912065 """ try: from zoneinfo import ZoneInfo tz = ZoneInfo('Asia/Shanghai') return datetime.now(tz) except ImportError: beijing_offset = timedelta(hours=8) current_time = datetime.now(timezone(beijing_offset)) return current_time host = settings.MYSQL_CONFIG.host port = settings.MYSQL_CONFIG.port username = settings.MYSQL_CONFIG.username password = settings.MYSQL_CONFIG.password database_name = settings.MYSQL_CONFIG.database_name db = MySQLDatabase( database=database_name, host=host, port=port, user=username, password=password, charset='utf8mb4' ) class User(Model): name = CharField(unique=True) age = IntegerField(null=True) address = CharField(null=True) city = CharField(null=True) birth = DateTimeField(null=True) created_at = DateTimeField( null=False, constraints=[SQL('DEFAULT CURRENT_TIMESTAMP')], help_text='使用數(shù)據(jù)庫(kù)時(shí)間' ) updated_at = DateTimeField( null=False, constraints=[ SQL('DEFAULT CURRENT_TIMESTAMP'), SQL('ON UPDATE CURRENT_TIMESTAMP'), ] ) class Meta: database = db table_name = 'user' model_set = [User] db.drop_tables(model_set) db.create_tables(model_set) d = get_cst_now_timestamp() print(d) q = User.select().where( User.age == 1, User.birth == d ) print('> sql', str(q)) list(q) q = User.insert({'created_at': d}) logger.debug(str(q)) q.execute()
修改 peewee 的源碼
輸出如下:
>>> execute_sql sql SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE() AND table_type != %s ORDER BY table_name
>> execute sql DROP TABLE IF EXISTS `user`
>>> execute_sql sql DROP TABLE IF EXISTS `user`
>>> execute_sql sql SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE() AND table_type != %s ORDER BY table_name
>> execute sql CREATE TABLE IF NOT EXISTS `user` (`id` INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` VARCHAR(255) NOT NULL, `age` INTEGER, `address` VARCHAR(255), `city` VARCHAR(255), `birth` DATETIME, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)
>>> execute_sql sql CREATE TABLE IF NOT EXISTS `user` (`id` INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` VARCHAR(255) NOT NULL, `age` INTEGER, `address` VARCHAR(255), `city` VARCHAR(255), `birth` DATETIME, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)
>> execute sql CREATE UNIQUE INDEX `user_name` ON `user` (`name`)
>>> execute_sql sql CREATE UNIQUE INDEX `user_name` ON `user` (`name`)
2023-06-17 14:26:22.111281+08:00
> sql SELECT `t1`.`id`, `t1`.`name`, `t1`.`age`, `t1`.`address`, `t1`.`city`, `t1`.`birth`, `t1`.`created_at`, `t1`.`updated_at` FROM `user` AS `t1` WHERE ((`t1`.`age` = 1) AND (`t1`.`birth` = '2023-06-17 14:26:22.111281+08:00'))
>> execute sql SELECT `t1`.`id`, `t1`.`name`, `t1`.`age`, `t1`.`address`, `t1`.`city`, `t1`.`birth`, `t1`.`created_at`, `t1`.`updated_at` FROM `user` AS `t1` WHERE ((`t1`.`age` = %s) AND (`t1`.`birth` = %s))
>>> execute_sql sql SELECT `t1`.`id`, `t1`.`name`, `t1`.`age`, `t1`.`address`, `t1`.`city`, `t1`.`birth`, `t1`.`created_at`, `t1`.`updated_at` FROM `user` AS `t1` WHERE ((`t1`.`age` = %s) AND (`t1`.`birth` = %s))
2023-06-17 14:26:22.116 | DEBUG | __main__:<module>:68 - INSERT INTO `user` (`created_at`) VALUES ('2023-06-17 14:26:22.111281+08:00')
>> execute sql INSERT INTO `user` (`created_at`) VALUES (%s)
>>> execute_sql sql INSERT INTO `user` (`created_at`) VALUES (%s)
self._query_type 0
注意,我現(xiàn)在測(cè)試的時(shí)間,就是北京時(shí)間下午2點(diǎn)
查看 wireshark 的時(shí)間
可以看到,抓包獲得的時(shí)間,都是下午2點(diǎn),說(shuō)明沒(méi)有發(fā)生時(shí)區(qū)轉(zhuǎn)換
數(shù)據(jù)中寫(xiě)入的時(shí)間,也是下午兩點(diǎn),說(shuō)明沒(méi)錯(cuò)
以上就是python pymysql peewee關(guān)于時(shí)區(qū)問(wèn)題分析的詳細(xì)內(nèi)容,更多關(guān)于python pymysql peewee時(shí)區(qū)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- IDEA連接mysql時(shí)區(qū)問(wèn)題解決
- Mysql查看數(shù)據(jù)庫(kù)時(shí)區(qū)并設(shè)置時(shí)區(qū)的方法
- MySQL時(shí)區(qū)差8小時(shí)的多種問(wèn)題解決方法
- 關(guān)于mysql的時(shí)區(qū)問(wèn)題
- MySQL中的時(shí)區(qū)設(shè)置方式
- mysql里CST時(shí)區(qū)的坑及解決
- MySQL修改時(shí)區(qū)的方法圖文詳解
- 一文帶你永久擺脫Mysql時(shí)區(qū)錯(cuò)誤問(wèn)題(idea數(shù)據(jù)庫(kù)可視化插件配置)
- MySQL Server時(shí)區(qū)支持的使用
相關(guān)文章
簡(jiǎn)單談?wù)刾ython基本數(shù)據(jù)類(lèi)型
在Python中,能夠直接處理的數(shù)據(jù)類(lèi)型有以下幾種:#整型 int,#浮點(diǎn)型 float,#布爾型 bool,#復(fù)數(shù)型 (在python中用小寫(xiě) j ,表示虛部,用其他的字母不行)complex2018-09-09Caffe卷積神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)層及參數(shù)
這篇文章主要為大家介紹了Caffe卷積神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)層及參數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06django如何計(jì)算兩個(gè)TimeField的時(shí)差
在Django中,可以使用datetime模塊來(lái)計(jì)算兩個(gè)TimeField字段的時(shí)間差,下面通過(guò)示例代碼介紹django?計(jì)算兩個(gè)TimeField的時(shí)差,需要的朋友可以參考下2023-05-05如何通過(guò)Python實(shí)現(xiàn)標(biāo)簽云算法
這篇文章主要介紹了如何通過(guò)Python實(shí)現(xiàn)標(biāo)簽云算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07python微元法計(jì)算函數(shù)曲線長(zhǎng)度的方法
今天小編就為大家分享一篇python微元法計(jì)算函數(shù)曲線長(zhǎng)度的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11python pycurl驗(yàn)證basic和digest認(rèn)證的方法
這篇文章主要介紹了python pycurl驗(yàn)證basic和digest認(rèn)證的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05全面解讀Python Web開(kāi)發(fā)框架Django
Django是一個(gè)開(kāi)源的Web應(yīng)用框架,由Python寫(xiě)成。采用MVC的軟件設(shè)計(jì)模式,主要目標(biāo)是使得開(kāi)發(fā)復(fù)雜的、數(shù)據(jù)庫(kù)驅(qū)動(dòng)的網(wǎng)站變得簡(jiǎn)單。Django注重組件的重用性和“可插拔性”,敏捷開(kāi)發(fā)和DRY法則(Don’t Repeat Yoursef)。2014-06-06Python一文入門(mén)Flask?Blueprint?SQLAlchemy部分詳解
這篇文章主要為大家介紹了Python一文入門(mén)Flask?Blueprint?SQLAlchemy部分詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Python中字符串轉(zhuǎn)換為列表的常用方法總結(jié)
本文將詳細(xì)介紹Python中將字符串轉(zhuǎn)換為列表的八種常用方法,每種方法都具有其獨(dú)特的用途和適用場(chǎng)景,文中的示例代碼講解詳細(xì),感興趣的可以了解下2023-11-11Python中itertools庫(kù)的四個(gè)函數(shù)介紹
這篇文章主要介紹了Python中itertools庫(kù)的四個(gè)函數(shù),主要討論itertools庫(kù)中的十分使用的幾個(gè)函數(shù),并重點(diǎn)介紹什么時(shí)候我們應(yīng)該考慮使用它們,需要的朋友可以參考一下2022-04-04