异步API数据库:SQLite与SQLAlchemy存储DateTime值不一致问题咨询
问题原因与解决方法
核心问题:SQL语法错误导致日期被当成算术运算处理
你遇到的这个奇怪结果,本质是手动编写的SQL插入语句犯了一个基础语法错误——没有将ISO格式的日期字符串用引号包裹。
当你执行insert into prices (date) values (2001-08-27);时,SQLite并不会把2001-08-27识别为日期字符串,而是会将其当作算术表达式计算:
2001 - 8 - 27 = 19662000 - 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
相关产品推荐
相关产品推荐

