删除非现有记录应该会在sqlalchemy中引发错误

时间:2013-02-20 16:54:37

标签: python sqlalchemy

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

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

感谢您的澄清。

ž

3 个答案:

答案 0 :(得分:4)

我不认为这是一个错误。例如,发出查询以删除sql中“不存在”

的记录是完全合法的

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

DELETE FROM posts WHERE ID > 0;

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

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

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

上面会发出一个额外的查询...

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

由于zzzeek使用条件<{p}}指出delete

  

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

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

答案 1 :(得分:0)

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

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

这对我有用。

答案 2 :(得分: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()