如何在SQLAlchemy中通过对象实现数据更新操作
SQLAlchemy更新Postgres student表失败的解决方案
现存代码错误点
- 模型定义问题:
- 模型类未继承SQLAlchemy声明基类(
declarative_base()生成的Base类),无法完成ORM映射 - 表名属性拼写错误:应为双下划线开头的
__tablename__,且赋值使用=而非: - 主键字段映射错误:数据库主键列是
Studentid,代码错误关联到了Student_name列,且SQLAlchemy中主键参数为primary_key=True,无pk=true的合法写法 - 其余字段属性名和数据库列名映射不一致,会导致赋值未对应到实际字段
- 模型类未继承SQLAlchemy声明基类(
- 更新逻辑问题:
- 未做非空判断:如果传入的id不存在,
get()返回None,后续赋值会直接报错 - 主键不建议直接修改:
studentid是主键,随意更新可能触发唯一约束冲突,导致更新失败
- 未做非空判断:如果传入的id不存在,
正确实现代码
1. 修正模型定义
from sqlalchemy import Column, String, Integer from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Student(Base): __tablename__ = 'student' __table_args__ = {'schema': 'student'} # 列名和数据库实际字段一一对应,primary_key指定主键 studentid = Column('Studentid', Integer, primary_key=True) studentname = Column('Student_name', String) studentdivision = Column('Student_division', String)
2. 修正更新逻辑
# 查询对应记录,SQLAlchemy 2.x推荐用filter_by替代get x = session.query(Student).filter_by(studentid=id).first() if not x: # 可自行添加不存在的处理逻辑,比如抛异常或者返回提示 raise ValueError("指定学生不存在") # 字段赋值,注意和模型属性名保持一致 # 主键不建议修改,如果确实有业务需求再保留该行,否则删除 # x.studentid = studentid x.studentname = name # 其余字段赋值同理 # x.studentdivision = division # 已经处于持久态的对象修改后不需要add,直接commit即可 session.commit()
内容的提问来源于stack exchange,提问作者Megh
相关产品推荐
相关产品推荐

