You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:13:21