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

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存为字符串类型

  1. 同步模型与表结构:在Flask Shell中执行以下命令重建表(仅开发环境适用,生产环境需用迁移工具):
    db.drop_all()
    db.create_all()
    
  2. 创建实例时直接传入符合长度要求的字符串时间即可:
    m = Message(name='L', content='db.test', timestamp='2024-08-14 12:17:30')
    db.session.add(m)
    db.session.commit()
    

方案二:将timestamp存为DateTime类型(推荐)

DateTime类型更便于后续的时间排序、范围查询等操作,建议采用:

  1. 修改模型定义:
    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)
    
  2. 更新表结构:同样在Flask Shell中执行:
    db.drop_all()
    db.create_all()
    
  3. 创建实例:传入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:15:09