如何使用frappe.db.delete语法删除符合筛选条件的单条记录?
错误原因
你原来的代码存在三个核心问题:
- 代码中使用了中文全角引号(
‘/“),不符合Python语法要求,会直接触发语法错误 - Frappe ORM的过滤条件不支持直接写
(运算符, 值)的元组格式作为字段值,语法不兼容 - 就算语法修复,基于modified字段过滤如果不加限制会删掉所有匹配该修改时间的记录,无法满足只删1条的需求
最稳妥的实现方案
Frappe 中所有 DocType 的记录都有唯一主键 name,推荐先查询到要删除的最新记录的主键,再基于主键删除,100% 保证只删1条不会误操作:
# 第一步:查询符合筛选条件的最新1条记录的主键 target_record_name = frappe.db.get_value( "Warehouse Locations", { "warehouse": warehouse, "parent": item_code, "shelf": shelf }, "name", order_by="modified desc", # 按修改时间倒序,取最新的1条 limit=1 ) # 第二步:存在匹配记录再执行删除 if target_record_name: frappe.db.delete("Warehouse Locations", {"name": target_record_name}) # 业务需要提交事务的话可加:frappe.db.commit()
基于modified字段匹配的修正写法
如果你能确定同筛选条件下不会出现两条modified时间完全一致的记录,也可以直接修正过滤语法后加limit参数实现需求:
frappe.db.delete( "Warehouse Locations", { "warehouse": warehouse, "parent": item_code, "shelf": shelf, "modified": last_record_to_keep[0].modified # 等于匹配直接传值即可,不需要加元组 }, limit=1 # 限制最多只删1条匹配记录 )
内容的提问来源于stack exchange,提问作者Mike Z
相关产品推荐
相关产品推荐

