SQLAlchemy查询SQLite的DATETIME('now')返回字符串,如何统一获取datetime对象
问题原因
这个差异是两方面共同作用的结果:
- 数据库返回的原生值类型不同:MySQL的
CURRENT_TIMESTAMP返回的是原生时间类型,对应Python MySQL驱动会直接将其映射为datetime对象;而SQLite本身无原生datetime类型,DATETIME('now')返回的是ISO格式的字符串,SQLite驱动不会默认将其转换为datetime对象。 - 你使用的是无类型标注的原生SQL查询,SQLAlchemy对于这类查询不会主动做跨数据库的类型映射,只会直接返回数据库驱动返回的原生值。
解决方案
最优方案是直接使用SQLAlchemy内置的跨数据库兼容时间函数,无需手动判断数据库类型,也能保证返回值统一为datetime对象:
from sqlalchemy import func # 自动适配不同数据库生成对应的时间查询语句,返回值统一为datetime类型 timestamp = session.execute(func.current_timestamp()).scalar()
如果确有需求要使用自定义原生SQL,可以手动给查询指定返回类型,强制SQLAlchemy做类型转换:
from sqlalchemy import text from sqlalchemy.types import DateTime if settings.DATABASE_URL.startswith("sqlite"): CURRENT_TIME_QUERY = text("SELECT DATETIME('now')").columns(DateTime) else: CURRENT_TIME_QUERY = text("SELECT CURRENT_TIMESTAMP").columns(DateTime) timestamp = session.execute(CURRENT_TIME_QUERY).scalar()
内容的提问来源于stack exchange,提问作者Djent
相关产品推荐
相关产品推荐

