”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何编写客户端脚本来删除frappe中的doctype所有数据

如何编写客户端脚本来删除frappe中的doctype所有数据

发布于2024-11-08
浏览:461

how to write client script for delete doctype all data in frappe

这是一篇包含您提供的脚本的博客文章:


使用Frappe批量删除WhatsApp消息

管理任何系统中的大量数据都可能具有挑战性,特别是在有效删除记录时。在Frappe中,我们可以通过自定义列表视图并批量删除记录来处理这种情况,以避免服务器过载。

在这篇文章中,我们将探讨如何使用 Frappe 中的自定义代码设置批量删除“WhatsApp Message”文档。

为什么要批量删除?

当处理数千或更多记录时,尝试一次删除它们可能会给您的服务器带来压力,导致超时或性能下降。批处理使我们能够将任务分解为更小的、可管理的块,从而减少服务器上的负载并确保更流畅的用户体验。

自定义列表视图

首先,我们将修改“WhatsApp Message”文档类型的列表视图,添加用于批量删除的按钮。此按钮将触发批量删除所有WhatsApp消息的过程。

自定义列表视图的代码如下:

frappe.listview_settings['WhatsApp Message'] = {
    onload: function(listview) {
        // Add a custom button in the list view
        // Uncomment this section to enable the button
         listview.page.add_inner_button(__('Delete All Docs'), function() {
            // Confirm before proceeding with the deletion
             frappe.confirm(
                 'Are you sure you want to delete all Whatsapp messages?',
                 function() {
                     Start the batch deletion process
                     delete_in_batches();
                 }
             );
         });
    }
};

代码的注释部分向列表视图添加了一个标有“删除所有文档”的按钮。单击后,它会在开始删除过程之前提示用户确认。您可以取消注释这部分代码以在您的环境中启用该按钮。

批量删除功能

这个过程的核心是delete_in_batches函数。该函数获取一批文档,逐个删除它们,然后延迟处理下一批文档,确保服务器不会不堪重负。

批量删除完整代码如下:

function delete_in_batches(batch_size = 2000) {
    // Step 1: Fetch a batch of documents to be deleted
    frappe.call({
        method: "frappe.client.get_list",
        args: {
            doctype: "WhatsApp Message",  // Your target doctype
            fields: ["name"],  // Fetch only the 'name' field (docnames)
            limit: batch_size  // Process in batches of 2000
        },
        callback: function(response) {
            let docs = response.message;

            if (docs && docs.length > 0) {
                // Step 2: Loop through each document in the batch and delete it
                docs.forEach(function(doc, index) {
                    frappe.call({
                        method: "frappe.client.delete",
                        args: {
                            doctype: "WhatsApp Message",  // Ensure this is correct
                            name: doc.name
                        },
                        callback: function(r) {
                            if (!r.exc) {
                                frappe.show_alert({
                                    message: `Document ${doc.name} deleted`,
                                    indicator: 'green'
                                });
                            }
                        }
                    });
                });

                // Step 3: Delay the next batch to prevent server overload
                setTimeout(function() {
                    delete_in_batches(batch_size);  // Recursive call to delete the next batch
                }, 2000);  // 2-second delay between batches
            } else {
                // No more documents to delete
                frappe.msgprint("All WhatsApp messages have been deleted.");
                frappe.listview.refresh();  // Refresh the list view once the process completes
            }
        }
    });
}

运作原理:

  1. 获取文档:

    该函数首先获取一批 WhatsApp Message 文档,批次的大小由batch_size 参数控制(默认为 2000)。

  2. 删除文档:

    对于获取的每个文档,脚本都会调用 frappe.client.delete 方法来删​​除该文档。每次成功删除后,都会向用户显示一条通知。

  3. 递归批处理:

    处理完一个批次后,该函数会暂停 2 秒,然后再获取并删除下一个批次。此延迟有助于防止服务器过载。

  4. 完成:

    当没有更多文档要删除时,会向用户显示一条消息,并刷新列表视图以反映更改。

结论:

这个脚本是一个简单而有效的解决方案,用于批量删除Frappe中的大量数据。通过将删除过程分成更小的、可管理的批次,我们可以避免服务器过载并确保操作顺利运行。您可以根据数据量和服务器容量修改批量大小和延迟以满足您的需求。

请随意将此脚本集成到您自己的 Frappe 应用程序中,以简化 WhatsApp 消息或任何其他文档类型的删除。

编写客户端脚本后,将此逻辑写入服务器脚本中,选择服务器脚本类型 API 并将此代码写入脚本中

下面是代码的详细解释,包括代码本身:

import frappe

@frappe.whitelist()
def delete_all_docs(doctype):
    # Get all documents of the specified doctype
    docs = frappe.get_all(doctype)

    # Loop through each document in the list
    for doc in docs:
        # Delete the document using its name and the provided doctype
        frappe.delete_doc(doctype, doc.name, force=1)

    # Commit the changes to the database to make deletions permanent
    frappe.db.commit()

    # Return a confirmation message
    return f"All documents from {doctype} have been deleted."

代码细分:

  1. import frappe:导入 frappe 模块,它是 Frappe 框架的核心,允许您访问数据库和服务器功能。

  2. @frappe.whitelist():此装饰器允许通过 Frappe 的 API 访问函数 delete_all_docs,并可从外部应用程序或脚本调用。

  3. def delete_all_docs(doctype)::定义该函数接受一个参数:

    • doctype:将删除所有记录的文档类型(例如“员工”、“客户”)。
  4. docs = frappe.get_all(doctype):这会获取指定 doctype 的所有文档并将它们存储在 docs 变量中。返回的每个文档将包含文档名称,用于删除。

  5. for doc in docs::该函数循环遍历列表 docs 中的每个文档。

  6. frappe.delete_doc(doctype, doc.name, force=1):在循环内,通过指定 doctype 和 doc.name 删除每个文档。 force=1 参数确保文档被强制删除,绕过验证规则并在必要时进行检查。

  7. frappe.db.commit():删除所有文档后,将提交数据库更改,使删除永久化。

  8. return f"所有来自{doctype}的文档已被删除。":删除所有文档后,返回成功信息,表示操作成功。

当您需要从 Frappe 应用程序中的特定文档类型中删除所有文档时,此功能非常有用。

版本声明 本文转载于:https://dev.to/04anilr/how-to-write-client-script-for-delete-doctype-all-data-in-frappe-18e0?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-04-05
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符在postgresql中提取最后一行,您可能需要遇到与数据集合中每个不同标识的信息相关的信息。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: id dat...
    编程 发布于2025-04-05
  • 如何配置Pytesseract以使用数字输出的单位数字识别?
    如何配置Pytesseract以使用数字输出的单位数字识别?
    Pytesseract OCR具有单位数字识别和仅数字约束 在pytesseract的上下文中,在配置tesseract以识别单位数字和限制单个数字和限制输出对数字可能会提出质疑。 To address this issue, we delve into the specifics of Te...
    编程 发布于2025-04-05
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-04-05
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-04-05
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-04-05
  • 如何在Java的全屏独家模式下处理用户输入?
    如何在Java的全屏独家模式下处理用户输入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    编程 发布于2025-04-05
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    在Microsoft Visual C 中,Microsoft consions用户strate strate strate strate strate strate strate strate strate strate strate strate strate strate strate st...
    编程 发布于2025-04-05
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-04-05
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-04-05
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-04-05
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php PHP陷入困境。使用simplexmlelement :: attributes()函数提供了简单的解决方案。此函数可访问对XML元素作为关联数组的属性: - > attributes()为$ attributeName => $ attributeValue){ echo ...
    编程 发布于2025-04-05
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-04-05
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-04-05
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能显示图像时未能显示图像时遇到了一个问题。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-04-05

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3