为何SQLModel中timezone参数不生效,插入时间始终为UTC?
SQLModel中DateTime时区字段插入本地时间失败的问题
我在用SQLModel做ORM开发时,尝试了两种方案处理DateTime字段的时区问题,但都没能成功——不管把timezone设为True还是False,插入表的时间始终是UTC时间。最后我通过cur_time: str = Field(default=datetime.now().strftime("%Y-%m-%d %H:%M:%S"))实现了本地时间插入,但疑惑为什么无法通过Column(DateTime(timezone=True))的方式插入本地时间。
代码示例
from datetime import datetime from sqlmodel import ( TIMESTAMP, Column, DateTime, Field, Session, SQLModel, create_engine, func, text, ) class Test(SQLModel, table=True): __tablename__ = "test" id: int | None = Field(default=None, primary_key=True) name: str # 参考方案1,插入UTC时间 first_time: datetime | None = Field( sa_column=Column( TIMESTAMP(timezone=True), nullable=False, server_default=text("CURRENT_TIMESTAMP"), ) ) # 参考方案2,插入UTC时间 second_time: datetime | None = Field( sa_column=Column(DateTime(timezone=True), server_default=func.now()) ) # 使用datetime.now(),插入本地时间 third_time: str = Field(default=datetime.now().strftime("%Y-%m-%d %H:%M:%S")) uri = "sqlite:///./test.db" engine = create_engine(uri, echo=True) SQLModel.metadata.create_all(engine) with Session(engine) as session: test = Test(name="test") session.add(test) session.commit()
测试环境与结果
- 使用版本:sqlmodel 0.0.20、sqlalchemy 2.0.31、Python 3.10.12
- 测试环境:Win10、Ubuntu 22.04,结果一致
- 插入结果:前两个字段为UTC时间,第三个字段为本地时间

Ubuntu系统时区信息
Local time: Fri 2024-07-19 15:04:41 CST Universal time: Fri 2024-07-19 07:04:41 UTC RTC time: Fri 2024-07-19 07:04:42 Time zone: Asia/Shanghai (CST, +0800) System clock synchronized: yes NTP service: active RTC in local TZ: no
内容的提问来源于stack exchange,提问作者Chuang Men
相关产品推荐
相关产品推荐

