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

异步API数据库:SQLite与SQLAlchemy存储DateTime值不一致问题咨询

问题原因与解决方法

核心问题:SQL语法错误导致日期被当成算术运算处理

你遇到的这个奇怪结果,本质是手动编写的SQL插入语句犯了一个基础语法错误——没有将ISO格式的日期字符串用引号包裹。

当你执行insert into prices (date) values (2001-08-27);时,SQLite并不会把2001-08-27识别为日期字符串,而是会将其当作算术表达式计算:

  • 2001 - 8 - 27 = 1966
  • 2000 - 4 - 21 = 1975

这两个计算出来的整数被存入了DateTime类型的列中,而SQLite的动态类型系统会接受这个数值并在查询时返回,这就导致了你看到的异常结果。

解决方法

1. 修正手动SQL语句

如果坚持手动写SQL,必须把日期字符串用单引号括起来,让数据库识别为字符串类型的日期值:

insert into prices (date) values ('2001-08-27');
insert into prices (date) values ('2000-04-21');

2. 推荐使用SQLAlchemy的参数化插入(更安全可靠)

既然你已经用了SQLAlchemy,完全没必要手动拼接SQL语句,直接传入Python的datetime对象即可,这样既避免语法错误,又能保证类型匹配:

from datetime import datetime
# 假设你已经配置好了异步session
async with async_session() as session:
    # 插入单条数据
    await session.execute(
        prices.insert().values(date=datetime(2001, 8, 27))
    )
    # 也可以批量插入
    await session.execute(
        prices.insert(),
        [{"date": datetime(2001, 8, 27)}, {"date": datetime(2000, 4, 21)}]
    )
    await session.commit()

额外说明

你并没有遗漏任何数据库配置,问题完全出在手动SQL的语法上。SQLite的动态类型特性允许这种“类型不匹配”的插入,但显然这不是你想要的结果。使用SQLAlchemy的ORM或核心API来操作数据,能最大程度避免这类人为错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:17:54