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

使用SQLAlchemy搭配SQLite3时日期类型解析异常问题求助

解决SQLAlchemy解析SQLite中"May 17, 1992"格式DATE列的问题

这个问题我之前也碰到过,本质是SQLite没有原生的DATE类型,而SQLAlchemy默认的DATE类型字段是按照ISO标准格式(YYYY-MM-DD)来解析和序列化的,你的数据用的是英文月份的日期格式,自然会触发解析错误。下面给你两种可行的解决方案:

方法1:自定义日期类型(推荐长期使用)

你可以给SQLAlchemy写一个自定义的日期类型处理器,让它能双向处理这种英文格式的日期:

首先导入需要的模块:

from datetime import datetime
from sqlalchemy import types
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, INTEGER

Base = declarative_base()

然后定义自定义日期类型:

class EnglishDate(types.TypeDecorator):
    impl = types.String  # SQLite用字符串存储这类日期
    cache_ok = True

    # 写入数据库时,把datetime对象转成"May 17, 1992"格式
    def process_bind_param(self, value, dialect):
        if value is None:
            return None
        return value.strftime("%b %d, %Y")

    # 从数据库读取时,把字符串转成datetime.date对象
    def process_result_value(self, value, dialect):
        if value is None:
            return None
        return datetime.strptime(value, "%b %d, %Y").date()

最后修改你的模型类,把date_of_birth的类型换成这个自定义类型:

class Users(Base):
    __tablename__ = 'users'
    user_id = Column(INTEGER, primary_key=True)
    date_of_birth = Column(EnglishDate)  # 替换原DATE类型

这样之后,不管是查询还是写入数据,SQLAlchemy都会自动处理这种日期格式,不会再报错。

方法2:查询时手动转换(临时应急)

如果你不想修改模型,只是临时查询数据,可以在查询语句里用SQLite的字符串函数手动转换格式:

from sqlalchemy import func

users = db_session.query(
    Users.user_id,
    func.strftime('%Y-%m-%d', func.date(Users.date_of_birth)).label('date_of_birth')
).all()

不过这种方法需要你手动处理每个查询的日期字段,而且返回的是字符串(不是date对象),只适合临时场景。


内容的提问来源于stack exchange,提问作者Ajit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:49:39