SQLAlchemy提交数据出现surfers.id非空约束报错如何解决
问题原因
- 表结构不匹配:代码中
Surfer类配置了__table_args__ = {'extend_existing': True},如果本地已经存在surfer.sqlite库,会直接沿用旧的surfers表结构,不会覆盖。旧表的主键列名为id,但你当前实体类里定义的主键是surfer_id,插入数据时SQLAlchemy不会给实际存在的id列赋值,就触发了NOT NULL约束报错。 - 外键赋值时机错误:你在创建
Bruno实例后还未将其写入数据库,就直接取Bruno.surfer_id给冲浪板实例的外键赋值,此时主键还未生成,取到的值为None,即使表结构问题解决,这里也会触发外键约束错误。
解决方案
步骤1:处理表结构冲突
二选一即可:
- 直接删除本地已有的
surfer.sqlite文件,启动代码时会自动按照你当前实体类的定义创建新表,主键为surfer_id - 不删除旧库的话,把
Surfer类里的主键字段名从surfer_id改为id,和旧表的主键列名保持一致即可
步骤2:调整外键赋值逻辑
修改创建实例和提交的顺序,先把冲浪者实例写入数据库生成主键后,再创建冲浪板实例:
# 仅展示修改后的核心逻辑,其余导入、表定义代码保持不变 Bruno = Surfer(name = 'Bruno', hometown = 'Chicago', wipeouts = 20, rank = 10) engine = create_engine("sqlite:///surfer.sqlite") conn = engine.connect() Base.metadata.create_all(conn) from sqlalchemy.orm import Session session = Session(bind=engine) # 先添加冲浪者,刷新会话拿到生成的主键 session.add(Bruno) session.flush() # 再创建冲浪板实例,此时可以拿到正确的外键值 new_board = Board(surfer_id = Bruno.surfer_id, board_name = 'yuh', color = 'purple', length =8) session.add(new_board) session.commit()
内容的提问来源于stack exchange,提问作者nunya
相关产品推荐
相关产品推荐

