Flask-SQLAlchemy关联查询后无法更新字段的解决方案求助
关联更新Vehicle表字段的可行方案(Flask-SQLAlchemy 2.5.1/SQLAlchemy 1.4.29)
关联查询返回的sqlalchemy.engine.row.Row是只读的结果集对象,并非ORM模型实例,因此无法直接赋值修改字段。以下是几种无需升级版本的可行解决方案:
方法1:通过模型关联关系直接操作ORM实例
如果你的模型已经定义了正确的关联关系(比如Registered表中配置了与Vehicle的relationship),可以直接通过Registered实例关联到对应的Vehicle实例进行修改:
# 模型定义参考 class Vehicle(db.Model): id = db.Column(db.Integer, primary_key=True) num_plate = db.Column(db.String(20)) class Registered(db.Model): regid = db.Column(db.Integer, primary_key=True) vehicle_id = db.Column(db.Integer, db.ForeignKey('vehicle.id')) # 定义关联关系 vehicle = db.relationship('Vehicle', backref=db.backref('registered', lazy=True)) # 更新操作代码 registered = Registered.query.filter_by(regid=3).first() if registered: registered.vehicle.num_plate = 'NEW_PLATE_123' db.session.commit()
方法2:使用SQLAlchemy的批量更新语句(高效无需加载实例)
直接构建带关联条件的update语句,无需加载ORM实例即可完成更新,适合对性能有要求的场景:
from sqlalchemy import update # 构建更新语句 update_stmt = ( update(Vehicle) .join(Registered, Vehicle.id == Registered.vehicle_id) .where(Registered.regid == 3) .values(num_plate='NEW_PLATE_123') ) # 执行更新并提交 db.session.execute(update_stmt) db.session.commit()
方法3:分步查询获取Vehicle实例后更新
如果不想依赖模型关联关系,可以先查询Registered拿到对应的vehicle_id,再单独查询Vehicle进行修改:
# 第一步:获取目标用户对应的vehicle_id registered = Registered.query.filter_by(regid=3).first() if registered: # 第二步:查询对应的Vehicle实例并更新 vehicle = Vehicle.query.get(registered.vehicle_id) vehicle.num_plate = 'NEW_PLATE_123' db.session.commit()
内容的提问来源于stack exchange,提问作者Ahmad Anis
相关产品推荐
相关产品推荐

