Hier ist ein Blog-Beitrag, der das von Ihnen bereitgestellte Skript enthält:
Die Verwaltung großer Datenmengen in jedem System kann eine Herausforderung sein, insbesondere wenn es darum geht, Datensätze effizient zu löschen. In Frappe können wir dieses Szenario bewältigen, indem wir die Listenansicht anpassen und Datensätze stapelweise löschen, um eine Überlastung des Servers zu vermeiden.
In diesem Beitrag erfahren Sie, wie Sie die Stapellöschung von „WhatsApp Message“-Dokumenten mithilfe von benutzerdefiniertem Code in Frappe einrichten.
Wenn Sie mit Tausenden oder mehr Datensätzen arbeiten, kann der Versuch, sie alle auf einmal zu löschen, Ihren Server überlasten und zu Zeitüberschreitungen oder einer langsamen Leistung führen. Durch die Stapelverarbeitung können wir die Aufgabe in kleinere, überschaubare Teile aufteilen, wodurch die Belastung des Servers verringert und ein reibungsloseres Benutzererlebnis gewährleistet wird.
Zuerst ändern wir die Listenansicht des Dokumenttyps „WhatsApp-Nachricht“, um eine Schaltfläche zum Stapellöschen hinzuzufügen. Diese Schaltfläche löst den Vorgang zum stapelweisen Löschen aller WhatsApp-Nachrichten aus.
Hier ist der Code zum Anpassen der Listenansicht:
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(); } ); }); } };
Der auskommentierte Teil des Codes fügt der Listenansicht eine Schaltfläche mit der Bezeichnung „Alle Dokumente löschen“ hinzu. Nach dem Anklicken wird der Benutzer zur Bestätigung aufgefordert, bevor der Löschvorgang gestartet wird. Sie können diesen Teil des Codes auskommentieren, um die Schaltfläche in Ihrer Umgebung zu aktivieren.
Der Kern dieses Prozesses ist die Funktion delete_in_batches. Diese Funktion ruft einen Stapel Dokumente ab, löscht sie einzeln und fährt dann mit einer Verzögerung mit dem nächsten Stapel fort, um sicherzustellen, dass der Server nicht überlastet wird.
Hier ist der vollständige Code für die Stapellöschung:
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 } } }); }
Dokumente abrufen:
Die Funktion beginnt mit dem Abrufen eines Stapels von WhatsApp-Nachrichtendokumenten, wobei die Größe des Stapels durch den Parameter „batch_size“ gesteuert wird (Standard ist 2000).
Dokumente löschen:
Für jedes abgerufene Dokument ruft das Skript die Methode frappe.client.delete auf, um das Dokument zu löschen. Nach jedem erfolgreichen Löschvorgang wird dem Benutzer eine Benachrichtigung angezeigt.
Rekursive Stapelverarbeitung:
Sobald ein Stapel verarbeitet wurde, pausiert die Funktion 2 Sekunden lang, bevor der nächste Stapel abgerufen und gelöscht wird. Diese Verzögerung hilft, eine Serverüberlastung zu verhindern.
Fertigstellung:
Wenn keine Dokumente mehr zum Löschen vorhanden sind, wird dem Benutzer eine Meldung angezeigt und die Listenansicht wird aktualisiert, um die Änderungen widerzuspiegeln.
Dieses Skript ist eine einfache, aber effektive Lösung zum Stapellöschen großer Datenmengen in Frappe. Indem wir den Löschvorgang in kleinere, überschaubare Stapel aufteilen, vermeiden wir eine Überlastung des Servers und stellen einen reibungslosen Ablauf sicher. Sie können die Batch-Größe und die Verzögerung je nach Datenvolumen und Serverkapazität an Ihre Bedürfnisse anpassen.
Fühlen Sie sich frei, dieses Skript in Ihre eigene Frappe-Anwendung zu integrieren, um das Löschen von WhatsApp-Nachrichten oder anderen Dokumenttypen zu optimieren.
Hier ist eine detaillierte Erklärung des Codes, einschließlich des Codes selbst:
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."
frappe importieren: Dies importiert das Frappe-Modul, das den Kern des Frappe-Frameworks darstellt, und ermöglicht Ihnen den Zugriff auf Datenbank- und Serverfunktionen.
@frappe.whitelist(): Dieser Dekorator ermöglicht, dass die Funktion delete_all_docs über die API von Frappe zugänglich und von externen Anwendungen oder Skripten aus aufrufbar ist.
def delete_all_docs(doctype):: Die Funktion ist so definiert, dass sie einen Parameter akzeptiert:
docs = frappe.get_all(doctype): Dadurch werden alle Dokumente des angegebenen Doctypes abgerufen und in der Variable docs gespeichert. Jedes zurückgegebene Dokument enthält den Dokumentnamen, der zum Löschen verwendet wird.
für Dokument in Dokumenten:: Die Funktion durchläuft jedes Dokument in der Liste Dokumente.
frappe.delete_doc(doctype, doc.name, force=1): Innerhalb der Schleife wird jedes Dokument durch Angabe des Doctype und des doc.name gelöscht. Das Argument „force=1“ stellt sicher, dass das Dokument zwangsweise gelöscht wird, wobei ggf. Validierungsregeln und Prüfungen umgangen werden.
frappe.db.commit(): Sobald alle Dokumente gelöscht sind, werden die Datenbankänderungen festgeschrieben, wodurch die Löschungen dauerhaft werden.
return f „Alle Dokumente von {doctype} wurden gelöscht.“: Nachdem alle Dokumente gelöscht wurden, wird eine Erfolgsmeldung zurückgegeben, die angibt, dass der Vorgang erfolgreich war.
Diese Funktion ist nützlich, wenn Sie alle Dokumente eines bestimmten Dokumenttyps in einer Frappe-Anwendung löschen müssen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3