亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python pymysql peewee關(guān)于時(shí)區(qū)問(wèn)題分析

 更新時(shí)間:2023年06月19日 10:05:44   作者:ponponon  
這篇文章主要為大家介紹了python pymysql peewee關(guān)于時(shí)區(qū)問(wèn)題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jì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)文章!

相關(guān)文章

  • 簡(jiǎn)單談?wù)刾ython基本數(shù)據(jù)類(lèi)型

    簡(jiǎn)單談?wù)刾ython基本數(shù)據(jù)類(lèi)型

    在Python中,能夠直接處理的數(shù)據(jù)類(lèi)型有以下幾種:#整型 int,#浮點(diǎn)型 float,#布爾型 bool,#復(fù)數(shù)型 (在python中用小寫(xiě) j ,表示虛部,用其他的字母不行)complex
    2018-09-09
  • Caffe卷積神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)層及參數(shù)

    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如何計(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ò)Python實(shí)現(xiàn)標(biāo)簽云算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python微元法計(jì)算函數(shù)曲線長(zhǎng)度的方法

    python微元法計(jì)算函數(shù)曲線長(zhǎng)度的方法

    今天小編就為大家分享一篇python微元法計(jì)算函數(shù)曲線長(zhǎng)度的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • python pycurl驗(yàn)證basic和digest認(rèn)證的方法

    python 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

    全面解讀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-06
  • Python一文入門(mén)Flask?Blueprint?SQLAlchemy部分詳解

    Python一文入門(mén)Flask?Blueprint?SQLAlchemy部分詳解

    這篇文章主要為大家介紹了Python一文入門(mén)Flask?Blueprint?SQLAlchemy部分詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Python中字符串轉(zhuǎn)換為列表的常用方法總結(jié)

    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ù)介紹

    這篇文章主要介紹了Python中itertools庫(kù)的四個(gè)函數(shù),主要討論itertools庫(kù)中的十分使用的幾個(gè)函數(shù),并重點(diǎn)介紹什么時(shí)候我們應(yīng)該考慮使用它們,需要的朋友可以參考一下
    2022-04-04

最新評(píng)論