我想以最优雅的 Python 方式实现的目标: 尝试在某个过滤器上查找数据库中的对象。仅当没有结果时,才尝试使用另一个过滤器查找对象。如果没有返回结果,则对象不存在,因此插入一个新实例。
我在想什么:
try:
obj = session.query(model).filter_by(field_a).one()
except NoObjFound:
try:
obj = session.query(model).filter_by(field_b).one()
except NoObjFound:
insert_into_db(brand_new_obj)
else:
update_the_obj(obj)
我不确定这个 block 是否正确或处理我想要完成的事情的最佳方式。
请您参考如下方法:
我会建议这样的:
for filter in (field_a, field_b):
try:
obj = session.query(model).filter_by(filter).one()
except NoObjFound:
pass # or 'continue'
else:
update_the_obj(obj)
break
else:
insert_into_db(brand_new_obj)
这将确保正确的事情以正确的顺序发生,比嵌套的 try block 更具可读性,并且可以轻松扩展以添加更多的 filter。
