Flask+SQLAlchemy更新时context.current_parameters缺失问题求助
解决SQLAlchemy更新时context.current_parameters缺失的问题
嘿,我之前做类似需求的时候也踩过这个坑!问题出在SQLAlchemy的context.current_parameters在部分字段更新时并不会包含所有模型字段——比如你只更新first_name而没碰name的话,current_parameters里就找不到'name'这个键,自然会抛出缺失错误。
下面给你两种靠谱的解决方案:
方案一:修改unaccent函数,兼容实例属性获取
直接在函数里先尝试从current_parameters拿值,拿不到就从当前实例的属性里取,这样不管是插入还是更新(哪怕只更新其他字段)都能正常工作:
from unidecode import unidecode def unaccent(context): # 优先从更新参数中获取name,没有则从实例本身取 name = context.current_parameters.get('name') if name is None: name = context.instance.name return unidecode(name) class MyModel(db.Model): id = Column(db.Integer, primary_key=True) first_name = db.Column(db.String(64)) name = db.Column(db.String(128)) name_unaccented = db.Column( db.String(128), default=unaccent, onupdate=unaccent )
方案二:使用SQLAlchemy事件监听(更推荐)
这种方式摆脱对context的依赖,直接在模型的插入/更新事件里处理无重音名称生成,逻辑更清晰也更稳定:
from unidecode import unidecode from sqlalchemy import event class MyModel(db.Model): id = Column(db.Integer, primary_key=True) first_name = db.Column(db.String(64)) name = db.Column(db.String(128)) name_unaccented = db.Column(db.String(128)) # 监听插入和更新事件,自动生成无重音名称 @event.listens_for(MyModel, 'before_insert') @event.listens_for(MyModel, 'before_update') def sync_unaccented_name(mapper, connection, target): target.name_unaccented = unidecode(target.name)
两种方案都能解决你遇到的问题,个人更推荐第二种,因为它不依赖SQLAlchemy内部的context参数结构,后续版本兼容性更好。
内容的提问来源于stack exchange,提问作者lukassliacky
相关产品推荐
相关产品推荐

