在SQLAlchemy中删除不存在的记录应引发错误
为什么在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
方法。
这会返回被删除的行数,不包括任何级联删除。
这也是查看是否有行被删除的另一种选择。