1

我想以最优雅的 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)

我不确定这个块是否正确或处理我想要完成的事情的最佳方式。

4

2 回答 2

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块更具可读性,并且可以轻松扩展以添加更多filters。

于 2014-05-16T14:55:37.047 回答
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)
于 2014-05-16T14:55:07.823 回答