我希望以最优雅的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)
我不确定这个区块是否正确或是处理我想要完成的事情的最佳方式。
答案 0 :(得分:6)
我会建议像:
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
块更具可读性,并且可以轻松扩展以添加更多filter
s。
答案 1 :(得分:0)
这是不正确的。假设您在找到与哪个过滤器无关的对象后想要update_the_obj(obj)
,那么末尾的else
子句将隐藏在内部过滤器中。
您可以尝试:
obj = None
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)
if obj is not None:
update_the_obj(obj)