欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > sqlalchemy时区问题

sqlalchemy时区问题

2025/1/31 9:00:03 来源:https://blog.csdn.net/liuzhenghua66/article/details/142584515  浏览:    关键词:sqlalchemy时区问题

问题描述

sqlalchemy查询时间字段时(包含timestamp),查询到python中使用datetime类型接收,不会进行时区类型转换,如果你的机器时区跟数据库时区不一致,就会导致比较时间时出问题。

解决方案

一般镜像默认的时区都是UTC,可以考虑将镜像时区和数据库连接时区都设置成UTC来解决这个问题。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmakerdb = create_engine(url='mysql+pymysql://<user>:<pass>@<db_host>:<db_port>/<db_name>?charset=utf8mb4',connect_args={'init_command': 'SET time_zone="+00:00"'}
)# Create database session
Session = sessionmaker(bind=db, expire_on_commit=False)

connect_args 是 SQLAlchemy 用于传递额外连接参数的字典,init_command 是其中一个选项。它的作用是在与数据库建立连接后立即执行的 SQL 命令。你可以用它来设置连接的初始状态,例如设置时区、字符集等。
参考文档:https://docs.sqlalchemy.org/en/20/core/engines.html#sqlalchemy.create_engine.params.connect_args

时区转换

可以利用这个方法,将时区转换成sql的时区格式(+08:00)

def convert_timezone_to_sql_format(timezone_str: str):
try:# 创建时区对象tz = pytz.timezone(timezone_str)# 获取当前时间在该时区的偏移量(秒)offset = tz.utcoffset(datetime.now()).total_seconds()hours = int(offset // 3600)minutes = int((abs(offset) % 3600) // 60)return f"{hours:+03d}:{minutes:02d}"
except pytz.UnknownTimeZoneError:# 也可以选择抛出异常logging.warning('Unknown timezone: %s, using default timezone UTC', timezone_str)return '+00:00'

时区可以从环境变量TZ中获取,需要注意数据库的时区一定要跟服务器的时区一致,否则时间比较会出问题。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com