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),导致数据库无法自动生成主键值,插入时触发报错。
修复步骤
修改数据库表结构,添加自增属性
直接修改建表语句,将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;确保模型与表结构匹配
模型中的autoincrement=True需要和数据库的AUTO_INCREMENT对应,两者保持一致后,插入数据无需手动指定id值。执行插入操作
保持现有插入代码不变,调用会话的add()和commit()方法即可完成插入,数据库会自动生成自增的id值。
内容的提问来源于stack exchange,提问作者codechef
相关产品推荐
相关产品推荐

