Flask-SQLAlchemy db.session.commit()报错:SQLite DateTime类型输入错误
错误原因与解决方法
错误原因
你的数据库表中timestamp字段的实际类型是DateTime,但模型里却定义成了String,并且你传入了字符串格式的时间值。SQLite的DateTime类型仅接受Python原生的datetime或date对象作为输入,因此触发类型错误。
通常这种不匹配是因为:
- 最初定义模型时
timestamp用的是db.DateTime,后来改成db.String但未更新数据库表结构(比如没删表重建或执行迁移); - 少数情况下,SQLite会根据字段名
timestamp自动推断为DateTime类型,忽略模型中的String定义。
解决方法
根据你的需求选择以下方案:
方案一:将timestamp存为字符串类型
- 同步模型与表结构:在Flask Shell中执行以下命令重建表(仅开发环境适用,生产环境需用迁移工具):
db.drop_all() db.create_all() - 创建实例时直接传入符合长度要求的字符串时间即可:
m = Message(name='L', content='db.test', timestamp='2024-08-14 12:17:30') db.session.add(m) db.session.commit()
方案二:将timestamp存为DateTime类型(推荐)
DateTime类型更便于后续的时间排序、范围查询等操作,建议采用:
- 修改模型定义:
from datetime import datetime class Message(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20), nullable=False) content = db.Column(db.Text, nullable=False) # 可设置default自动填充当前时间 timestamp = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) - 更新表结构:同样在Flask Shell中执行:
db.drop_all() db.create_all() - 创建实例:传入
datetime对象,或依赖默认值:# 手动指定时间 m = Message(name='L', content='db.test', timestamp=datetime.strptime('2024-08-14 12:17:30', '%Y-%m-%d %H:%M:%S')) # 或使用默认当前时间 m = Message(name='L', content='db.test') db.session.add(m) db.session.commit()
内容的提问来源于stack exchange,提问作者moyu Lua
相关产品推荐
相关产品推荐

