为什么删除不存在的记录不会在 sqlalchemy 中引发错误。没有关于记录是否被删除的反馈。
session.query(Element).filter(Element.id==ElementId).delete()
谢谢你的澄清。
为什么删除不存在的记录不会在 sqlalchemy 中引发错误。没有关于记录是否被删除的反馈。
session.query(Element).filter(Element.id==ElementId).delete()
谢谢你的澄清。
我不认为这是一个错误。例如,发出查询以删除 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
返回删除的行数,不包括任何级联。
这是查看是否删除任何行的另一个选项
实际上,sqlalchemy 删除操作返回受影响的行数。因此,您可以检查,如果受影响的行为 0,那么您可以引发错误。
effected_rows = session.query(Element).filter(Element.id==ElementId).delete()
if effected_rows == 0:
# raise exception
else:
# delete element
这对我有用。
向@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()