」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何編寫客戶端腳本來刪除frappe中的doctype所有數據

如何編寫客戶端腳本來刪除frappe中的doctype所有數據

發佈於2024-11-08
瀏覽:627

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如有侵犯,請聯絡study_golang@163 .com刪除
最新教學 更多>
  • CSS 中的「display: table-column」實際上做了什麼?
    CSS 中的「display: table-column」實際上做了什麼?
    CSS「display: table-column」該如何運作? 在 HTML 中,表格由行組成,每行含有細胞。 CSS 擴展了這個概念,讓設計者定義特定的行和列佈局。雖然「display: table-row」和「display: table-cell」很簡單,但「display: table-c...
    程式設計 發佈於2024-11-14
  • Babel 6 如何以不同的方式處理預設導出?
    Babel 6 如何以不同的方式處理預設導出?
    重大變更:Babel 6 匯出預設行為隨著 Babel 6 的發布,預設導出的處理方式發生了重大變化。雖然 Babel 之前新增了 module.exports = Exports["default"] 行,但此功能已被刪除。 此修改需要更改模組導入語法。以前,使用舊語法的程式碼...
    程式設計 發佈於2024-11-14
  • 掌握 Next.js 中的 SSR:如何提升 SEO 與使用者體驗
    掌握 Next.js 中的 SSR:如何提升 SEO 與使用者體驗
    SSR(伺服器端渲染)是 Next.js 中產生頁面的另一種方法。在本文中,我想解釋什麼是 SSR、它是如何運作的,以及如何在 Next.js 專案的 Page Router 和 App Router 中實現它。 什麼是SSR? SSR是一種在使用者發出請求後產生靜態頁面(或預先渲...
    程式設計 發佈於2024-11-14
  • 為什麼 PHP 5.2 不允許抽象靜態類別方法?
    為什麼 PHP 5.2 不允許抽象靜態類別方法?
    PHP 5.2 嚴格模式:為什麼不允許抽象靜態類別方法? 在 PHP 5.2 中,啟用嚴格警告可能會觸發熟悉的警告:「靜態函數不應該是抽象的」。此警告源自於 PHP 5.2 中引入的一項更改,該更改不允許抽象靜態類別方法。 原因:歷史監督PHP 5.2 最初缺乏後期靜態綁定,使抽象靜態函數變得無用。...
    程式設計 發佈於2024-11-14
  • 如何為 10 個連續點的每段繪製不同顏色的線?
    如何為 10 個連續點的每段繪製不同顏色的線?
    用不同的顏色繪製一條線問題陳述給定兩個列表,latt和lont,目標是繪製一條線,其中每個清單10個連續點的線段以不同的顏色表示。 解決方案解決方案線段數量有限import numpy as np import matplotlib.pyplot as plt # Generate random c...
    程式設計 發佈於2024-11-14
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-14
  • 如何在 MySQL 中根據計數過濾資料而不使用嵌套 SELECT?
    如何在 MySQL 中根據計數過濾資料而不使用嵌套 SELECT?
    MySQL - 在WHERE 子句中使用COUNT(*)使用者在嘗試使用WHERE 子句中的COUNT(*) 函數過濾MySQL 中的資料時遇到了挑戰WHERE 子句。他們尋求一種有效的方法來完成此任務,而不使用巢狀 SELECT 語句,因為它會消耗大量資源。 使用者提供了以下偽代碼來說明他們期望的...
    程式設計 發佈於2024-11-14
  • 如何在 Python 中按名稱存取 SQL 結果列值?
    如何在 Python 中按名稱存取 SQL 結果列值?
    在Python 中按列名稱存取SQL 結果列值處理資料庫中的大量列時,依賴列索引資料來擷取可能會變得很麻煩。本文透過提供一種在 Python 中使用列名稱檢索 SQL 結果列值的方法來解決對更直觀方法的需求。 解決方案:利用 DictCursor Python 的 MySQLdb 模組提供了 Dic...
    程式設計 發佈於2024-11-14
  • 何時使用 Django ORM 的 select_lated 與 prefetch_lated?
    何時使用 Django ORM 的 select_lated 與 prefetch_lated?
    Django ORM 的 select_lated 和 prefetch_lated 之間的區別在 Django ORM 中,select_lated 和 prefetch_lated 方法在管理資料庫查詢中的關係方面具有不同的用途。 select_latedDjango的select_lated方...
    程式設計 發佈於2024-11-14
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-14
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-13
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1和$array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建構一...
    程式設計 發佈於2024-11-13
  • 使用 Python 將 .png 檔案從一個資料夾移到另一個資料夾
    使用 Python 將 .png 檔案從一個資料夾移到另一個資料夾
    嘗試之前;請確保您的電腦上安裝了 python。 在 python IDE 中,您需要先匯入 pathlib 和 os 函式庫。兩者都是 python 標準函式庫的一部分,因此不需要外部安裝。 1.)導入必要的函式庫(pathlib和os)。 2.)找到桌面的路徑。 3.) 建立一個名為「S...
    程式設計 發佈於2024-11-13
  • Node.js 流:什麼、為什麼以及如何使用它們
    Node.js 流:什麼、為什麼以及如何使用它們
    高效处理大数据对于现代 Web 应用程序至关重要。将整个文件加载到内存中的传统方法对于处理大量数据来说并不是最佳选择。这就是 Node.js 中的 Streams 派上用场的地方。它们允许您逐段(以块的形式)处理数据,从而提高性能、减少内存使用并提高效率。在本文中,我们将探讨什么是流、为什么它们很重...
    程式設計 發佈於2024-11-13
  • std::move() 如何處理 C++ 中的左值?
    std::move() 如何處理 C++ 中的左值?
    std::move() 對左值有何作用? std::move() 是 C 語言中一個強大的工具,用於促進完美轉發。然而,乍一看,它的實施可能會引起一些人的注意。為了闡明 std::move() 如何實現這一點,讓我們深入研究其實現的複雜性。 理解「移動」函數我們將從「move」函數範本的簡化版本:t...
    程式設計 發佈於2024-11-13

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3