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

SQLAlchemy自增主键插入报错:字段'id'无默认值

问题

使用SQLAlchemy插入数据时遭遇报错,相关信息如下:

模型类

class ActivityLog(Base):
    __tablename__ = "activity_log"
    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    username = Column(String(200), nullable=False, index=True)
    request_url = Column(String(200), nullable=False, unique=False, index=False)
    execution_timestamp = Column(DateTime, default=datetime.datetime.utcnow)
    response_type = Column(String(100), nullable=False, unique=False, index=False)
    input_params = Column(String(100), nullable=False, unique=False, index=False)

建表语句

create table activity_log 
(id int NOT NULL, 
 username varchar(200) NOT NULL, 
 request_url varchar(200) NOT NULL, 
 execution_timestamp timestamp NOT NULL, 
 response_type varchar(100), 
 input_params varchar(100), 
 constraint activity_log_pk PRIMARY KEY (id));

插入代码

data_file = models.ActivityLog(username=username,
                           request_url=request_url,
                           execution_timestamp=execution_timestamp,
                           response_type=str(type(audio_wav)),
                           input_params=utterance_id)

报错信息

(pymysql.err.OperationalError) (1364, "Field 'id' doesn't have a default value")

如何解决这个自增主键id的插入问题?


解决方法

问题根源

模型类中id字段设置了autoincrement=True,但实际数据库表的id字段未声明为自增类型(MySQL需用AUTO_INCREMENT),导致数据库无法自动生成主键值,插入时触发报错。

修复步骤

  1. 修改数据库表结构,添加自增属性
    直接修改建表语句,将id int NOT NULL改为id int NOT NULL AUTO_INCREMENT,完整语句如下:

    create table activity_log 
    (id int NOT NULL AUTO_INCREMENT, 
     username varchar(200) NOT NULL, 
     request_url varchar(200) NOT NULL, 
     execution_timestamp timestamp NOT NULL, 
     response_type varchar(100), 
     input_params varchar(100), 
     constraint activity_log_pk PRIMARY KEY (id));
    

    若表已存在,用ALTER TABLE语句修改:

    ALTER TABLE activity_log MODIFY COLUMN id int NOT NULL AUTO_INCREMENT;
    
  2. 确保模型与表结构匹配
    模型中的autoincrement=True需要和数据库的AUTO_INCREMENT对应,两者保持一致后,插入数据无需手动指定id值。

  3. 执行插入操作
    保持现有插入代码不变,调用会话的add()和commit()方法即可完成插入,数据库会自动生成自增的id值。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:39:23