python pymysql peewee关于时区问题分析

 更新时间:2023年06月19日 10:05:44   作者:ponponon  
这篇文章主要为大家介绍了python pymysql peewee关于时区问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

研究的问题:如果我插入一个 datetime 的 tzinfo 北京时区的,peewee insert 的时候,会帮我转成 utc 再插入吗?

答案:不会

研究过程

我们通过

  • peewee 返回对的 sql
  • peewee 内部的 sql
  • 以及 wireshark 抓包获取的 sql

验证判断

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='使用数据库时间'
    )
    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

 注意,我现在测试的时间,就是北京时间下午2点

查看 wireshark 的时间

可以看到,抓包获得的时间,都是下午2点,说明没有发生时区转换

数据中写入的时间,也是下午两点,说明没错

以上就是python pymysql peewee关于时区问题分析的详细内容,更多关于python pymysql peewee时区的资料请关注脚本之家其它相关文章!

相关文章

  • 用Python写冒泡排序代码

    用Python写冒泡排序代码

    本文给大家分享一段代码使用python写一个冒泡排序小程序,代码非常简单,感兴趣的朋友参考下吧
    2016-04-04
  • PyTorch张量拼接、切分、索引的实现

    PyTorch张量拼接、切分、索引的实现

    在学习深度学习的过程中,遇到的第一个概念就是张量,张量在pytorch中的计算十分重要,本文主要介绍了PyTorch张量拼接、切分、索引的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Django之第三方平台QQ授权登录的实现

    Django之第三方平台QQ授权登录的实现

    本文主要介绍了Django之第三方平台QQ授权登录的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • python操作excel的方法

    python操作excel的方法

    Openpyxl是一个常用的python库,用于对Excel的常用格式及其模板进行数据读写等操作。这篇文章主要介绍了python操作excel的方法,需要的朋友可以参考下
    2018-08-08
  • python教程之生成器和匿名函数

    python教程之生成器和匿名函数

    这篇文章主要为大家介绍了python生成器和匿名函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • python实现自动重启本程序的方法

    python实现自动重启本程序的方法

    这篇文章主要介绍了python实现自动重启本程序的方法,涉及Python进程操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Python Pandas学习之Pandas数据结构详解

    Python Pandas学习之Pandas数据结构详解

    Pandas中一共有三种数据结构,分别为:Series、DataFrame和MultiIndex(老版本中叫Panel )。其中Series是一维数据结构,DataFrame是二维的表格型数据结构,MultiIndex是三维的数据结构。本文将详细为大家讲解这三个数据结构,需要的可以参考一下
    2022-02-02
  • 浅谈keras中的目标函数和优化函数MSE用法

    浅谈keras中的目标函数和优化函数MSE用法

    这篇文章主要介绍了浅谈keras中的目标函数和优化函数MSE用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • pyspark操作MongoDB的方法步骤

    pyspark操作MongoDB的方法步骤

    这篇文章主要介绍了pyspark操作MongoDB的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 使用tf.keras.MaxPooling1D出现错误问题及解决

    使用tf.keras.MaxPooling1D出现错误问题及解决

    这篇文章主要介绍了使用tf.keras.MaxPooling1D出现错误问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论