5

为什么删除不存在的记录不会在 sqlalchemy 中引发错误。没有关于记录是否被删除的反馈。

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

谢谢你的澄清。

4

3 回答 3

7

我不认为这是一个错误。例如,发出查询以删除 sql 中“不存在”的记录是完全合法的

如果我有一个带有“id”列的“posts”表。没有记录

DELETE FROM posts WHERE ID > 0;

这是完全有效的sql,没有错误,即使没有行

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

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

上面将发出一个额外的查询,但......

此外,如果您想要一个delete引发错误的方法,您可以创建自己的会话类 更改 SQLAlchemy 的 Session.delete() 行为 并覆盖delete

正如zzzeekdelete用标准指出的那样

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

这是查看是否删除任何行的另一个选项

于 2013-02-20T16:58:11.637 回答
4

实际上,sqlalchemy 删除操作返回受影响的行数。因此,您可以检查,如果受影响的行为 0,那么您可以引发错误。

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

这对我有用。

于 2019-07-04T09:04:26.570 回答
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()
于 2020-11-05T06:54:31.497 回答