제공하신 스크립트가 포함된 블로그 게시물은 다음과 같습니다.
모든 시스템에서 대량의 데이터를 관리하는 것은 어려울 수 있으며, 특히 기록을 효율적으로 삭제하는 경우 더욱 그렇습니다. Frappe에서는 서버 과부하를 방지하기 위해 목록 보기를 사용자 정의하고 일괄적으로 기록을 삭제하여 이 시나리오를 처리할 수 있습니다.
이 게시물에서는 Frappe 내에서 사용자 정의 코드를 사용하여 "WhatsApp 메시지" 문서의 일괄 삭제를 설정하는 방법을 살펴보겠습니다.
수천 개 이상의 레코드를 처리할 때 한꺼번에 삭제하려고 하면 서버에 부담을 주어 시간 초과나 성능 저하가 발생할 수 있습니다. 일괄 처리를 통해 작업을 더 작고 관리 가능한 덩어리로 나누어 서버의 로드를 줄이고 보다 원활한 사용자 경험을 보장할 수 있습니다.
먼저 "WhatsApp 메시지" 문서 유형의 목록 보기를 수정하여 일괄 삭제를 위한 버튼을 추가하겠습니다. 이 버튼은 모든 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 } } }); }
문서 가져오는 중:
이 함수는 일괄 처리 크기 매개변수(기본값은 2000)로 제어되는 일괄 처리 크기를 사용하여 WhatsApp 메시지 문서 일괄 처리를 가져오는 것으로 시작됩니다.
문서 삭제:
가져온 각 문서에 대해 스크립트는 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):: 이 함수는 하나의 매개변수를 허용하도록 정의됩니다:
docs = frappe.get_all(doctype): 지정된 doctype의 모든 문서를 가져와 docs 변수에 저장합니다. 반환된 각 문서에는 삭제에 사용되는 문서 이름이 포함됩니다.
for doc in docs:: 이 함수는 목록 문서의 각 문서를 반복합니다.
frappe.delete_doc(doctype, doc.name, force=1): 루프 내에서 doctype과 doc.name을 지정하여 각 문서가 삭제됩니다. force=1 인수는 유효성 검사 규칙을 우회하고 필요한 경우 확인하여 문서가 강제로 삭제되도록 보장합니다.
frappe.db.commit(): 모든 문서가 삭제되면 데이터베이스 변경 사항이 커밋되어 삭제 내용이 영구적으로 적용됩니다.
return f"{doctype}의 모든 문서가 삭제되었습니다.": 모든 문서가 삭제된 후 작업이 성공했음을 나타내는 성공 메시지가 반환됩니다.
이 기능은 Frappe 애플리케이션의 특정 문서 유형에서 모든 문서를 삭제해야 할 때 유용합니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3