python pymysql peewee關(guān)于時(shí)區(qū)問題分析
正文
研究的問題:如果我插入一個(gè) datetime 的 tzinfo 北京時(shí)區(qū)的,peewee insert 的時(shí)候,會(huì)幫我轉(zhuǎn)成 utc 再插入嗎?
答案:不會(huì)
研究過程
我們通過
- 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ō)明沒有發(fā)生時(shí)區(qū)轉(zhuǎn)換

數(shù)據(jù)中寫入的時(shí)間,也是下午兩點(diǎn),說(shuō)明沒錯(cuò)
以上就是python pymysql peewee關(guān)于時(shí)區(qū)問題分析的詳細(xì)內(nèi)容,更多關(guān)于python pymysql peewee時(shí)區(qū)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- IDEA連接mysql時(shí)區(qū)問題解決
- Mysql查看數(shù)據(jù)庫(kù)時(shí)區(qū)并設(shè)置時(shí)區(qū)的方法
- MySQL時(shí)區(qū)差8小時(shí)的多種問題解決方法
- 關(guān)于mysql的時(shí)區(qū)問題
- MySQL中的時(shí)區(qū)設(shè)置方式
- mysql里CST時(shí)區(qū)的坑及解決
- MySQL修改時(shí)區(qū)的方法圖文詳解
- 一文帶你永久擺脫Mysql時(shí)區(qū)錯(cuò)誤問題(idea數(shù)據(jù)庫(kù)可視化插件配置)
- MySQL Server時(shí)區(qū)支持的使用
相關(guān)文章
簡(jiǎn)單談?wù)刾ython基本數(shù)據(jù)類型
在Python中,能夠直接處理的數(shù)據(jù)類型有以下幾種:#整型 int,#浮點(diǎn)型 float,#布爾型 bool,#復(fù)數(shù)型 (在python中用小寫 j ,表示虛部,用其他的字母不行)complex2018-09-09
Caffe卷積神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)層及參數(shù)
這篇文章主要為大家介紹了Caffe卷積神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)層及參數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
django如何計(jì)算兩個(gè)TimeField的時(shí)差
在Django中,可以使用datetime模塊來(lái)計(jì)算兩個(gè)TimeField字段的時(shí)間差,下面通過示例代碼介紹django?計(jì)算兩個(gè)TimeField的時(shí)差,需要的朋友可以參考下2023-05-05
如何通過Python實(shí)現(xiàn)標(biāo)簽云算法
這篇文章主要介紹了如何通過Python實(shí)現(xiàn)標(biāo)簽云算法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
python微元法計(jì)算函數(shù)曲線長(zhǎng)度的方法
今天小編就為大家分享一篇python微元法計(jì)算函數(shù)曲線長(zhǎng)度的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-11-11
python pycurl驗(yàn)證basic和digest認(rèn)證的方法
這篇文章主要介紹了python pycurl驗(yàn)證basic和digest認(rèn)證的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-05-05
Python一文入門Flask?Blueprint?SQLAlchemy部分詳解
這篇文章主要為大家介紹了Python一文入門Flask?Blueprint?SQLAlchemy部分詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Python中字符串轉(zhuǎn)換為列表的常用方法總結(jié)
本文將詳細(xì)介紹Python中將字符串轉(zhuǎn)換為列表的八種常用方法,每種方法都具有其獨(dú)特的用途和適用場(chǎng)景,文中的示例代碼講解詳細(xì),感興趣的可以了解下2023-11-11
Python中itertools庫(kù)的四個(gè)函數(shù)介紹
這篇文章主要介紹了Python中itertools庫(kù)的四個(gè)函數(shù),主要討論itertools庫(kù)中的十分使用的幾個(gè)函數(shù),并重點(diǎn)介紹什么時(shí)候我們應(yīng)該考慮使用它們,需要的朋友可以參考一下2022-04-04

