使用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
相关产品推荐
相关产品推荐

