在SQLAlchemy中删除不存在的记录应引发错误

7 投票
3 回答
9096 浏览
提问于 2025-04-17 16:31

为什么在sqlalchemy中删除一个不存在的记录不会报错呢?而且也没有任何反馈告诉我们这个记录是否被删除了。

session.query(Element).filter(Element.id==ElementId).delete()

谢谢你的解释。

3 个回答

0

为了补充@madogan的回答,因为编辑队列满了,所以我写了一个新的回答。

我在他的回答基础上,详细扩展了一下,提供了一个可行的解决方案:

class NoEntryFoundException(Exception):
    pass


def delete_row_entry(element_id: int):
    effected_rows = session.query(Element).filter(Element.id == element_id).delete()

    if effected_rows == 0:
        raise NoEntryFoundException(f'No row entry found with id: {element_id}')
    else:
        session.commit()
4

其实,sqlalchemy的删除操作会返回受影响的行数。所以你可以检查一下,如果受影响的行数是0,那你就可以抛出一个错误。

effected_rows = session.query(Element).filter(Element.id==ElementId).delete()
if effected_rows == 0:
    # raise exception
else:
    # delete element

这个对我来说是有效的。

8

我觉得这不是个错误。比如说,在SQL中发出一个删除不存在记录的查询是完全合法的。

假设我有一个叫做'posts'的表,里面有一个'id'的列,但没有任何记录。

DELETE FROM posts WHERE ID > 0;

这条SQL语句是完全有效的,即使没有任何行,它也不会报错。

我对sqlalchemy不太熟悉,但你能先检查一下值是否存在吗?

element = session.query(Element).filter(Element.id==ElementId).first()
if element:
   # delete element
else:
   # raise exception

不过这样会多发一条查询...

另外,如果你想要一个在删除时会报错的delete方法,你可以创建自己的会话类,改变SQLAlchemy的Session.delete()行为,并重写delete方法。

正如zzzeek所指出的,delete可以带条件。

这会返回被删除的行数,不包括任何级联删除。

这也是查看是否有行被删除的另一种选择。

撰写回答