あなたが提供したスクリプトを組み込んだブログ投稿は次のとおりです:
どのシステムでも大量のデータを管理することは、特にレコードを効率的に削除する場合に困難になることがあります。 Frappe では、サーバーの過負荷を避けるために、リスト ビューをカスタマイズし、レコードをバッチで削除することで、このシナリオに対処できます。
この投稿では、Frappe 内のカスタム コードを使用して「WhatsApp メッセージ」ドキュメントの一括削除を設定する方法を説明します。
数千以上のレコードを扱う場合、すべてを一度に削除しようとするとサーバーに負担がかかり、タイムアウトやパフォーマンスの低下が発生する可能性があります。バッチ処理により、タスクをより小さく管理しやすいチャンクに分割できるため、サーバーの負荷が軽減され、よりスムーズなユーザー エクスペリエンスが保証されます。
まず、「WhatsApp メッセージ」Doctype のリスト ビューを変更して、一括削除用のボタンを追加します。このボタンは、すべての 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 関数です。この関数は、ドキュメントのバッチを取得し、それらを 1 つずつ削除してから、サーバーに負荷がかからないよう、遅延して次のバッチに進みます。
バッチ削除の完全なコードは次のとおりです:
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 } } }); }
ドキュメントをフェッチしています:
この関数は、WhatsApp メッセージ ドキュメントのバッチを取得することから始まります。バッチのサイズは、batch_size パラメーターによって制御されます (デフォルトは 2000)。
ドキュメントの削除:
フェッチされたドキュメントごとに、スクリプトは frappe.client.delete メソッドを呼び出してドキュメントを削除します。削除が成功するたびに、ユーザーに通知が表示されます。
再帰的バッチ処理:
バッチが処理されると、関数は 2 秒間一時停止してから、次のバッチを取得して削除します。この遅延は、サーバーの過負荷を防ぐのに役立ちます。
完了:
削除するドキュメントがなくなると、ユーザーにメッセージが表示され、リスト ビューが更新されて変更が反映されます。
このスクリプトは、Frappe の大量のデータを一括削除するためのシンプルかつ効果的なソリューションです。削除プロセスを小さく管理しやすいバッチに分割することで、サーバーの過負荷を回避し、操作がスムーズに実行されるようにします。データの量とサーバーの容量に応じて、ニーズに合わせてバッチ サイズと遅延を変更できます。
このスクリプトを独自の Frappe アプリケーションに自由に統合して、WhatsApp メッセージやその他の種類のドキュメントの削除を効率化できます。
コード自体を含むコードの詳細な説明は次のとおりです:
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."
import frappe: これにより、Frappe フレームワークのコアである frappe モジュールがインポートされ、データベースおよびサーバーの機能にアクセスできるようになります。
@frappe.whitelist(): このデコレーターにより、関数 delete_all_docs が Frappe の API 経由でアクセス可能になり、外部アプリケーションまたはスクリプトから呼び出せるようになります。
def delete_all_docs(doctype):: 関数は 1 つのパラメーターを受け入れるように定義されています:
docs = frappe.get_all(doctype): これは、指定された doctype のすべてのドキュメントをフェッチし、docs 変数に保存します。返される各ドキュメントには、削除に使用されるドキュメント名が含まれます。
for doc in docs:: この関数は、リスト docs.
frappe.delete_doc(doctype, doc.name,force=1): ループ内で、doctype と doc.name を指定して各ドキュメントを削除します。 Force=1 引数を指定すると、必要に応じて検証ルールやチェックがバイパスされ、ドキュメントが強制的に削除されます。
frappe.db.commit(): すべてのドキュメントが削除されると、データベースの変更がコミットされ、削除が永続的になります。
return f"{doctype} のドキュメントはすべて削除されました。": すべてのドキュメントが削除されると、操作が成功したことを示す成功メッセージが返されます。
この関数は、Frappe アプリケーションの特定の doctype からすべてのドキュメントを削除する必要がある場合に便利です。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3