Вот запись в блоге, включающая предоставленный вами сценарий:
Управление большими объемами данных в любой системе может оказаться сложной задачей, особенно когда речь идет об эффективном удалении записей. В Frappe мы можем справиться с этим сценарием, настроив представление списка и удалив записи в пакетном режиме, чтобы избежать перегрузки сервера.
В этом посте мы рассмотрим, как настроить пакетное удаление документов «Сообщение WhatsApp» с помощью специального кода в Frappe.
При работе с тысячами или более записями попытка удалить их все одновременно может привести к перегрузке вашего сервера, что приведет к тайм-аутам или снижению производительности. Пакетная обработка позволяет нам разбить задачу на более мелкие, управляемые фрагменты, снижая нагрузку на сервер и обеспечивая более плавное взаимодействие с пользователем.
Сначала мы изменим представление списка типа документа «Сообщение 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 } } }); }
Загрузка документов:
Функция начинается с извлечения пакета документов сообщений WhatsApp, размер которого контролируется параметром patch_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 быть доступной через API Frappe и вызываться из внешних приложений или скриптов.
def delete_all_docs(doctype):: функция определена так, чтобы принимать один параметр:
docs = frappe.get_all(doctype): извлекает все документы указанного типа документа и сохраняет их в переменной docs. Каждый возвращенный документ будет содержать имя документа, которое используется для удаления.
для документа в документах:: функция проходит по каждому документу в списке документов.
frappe.delete_doc(doctype, doc.name, Force=1): внутри цикла каждый документ удаляется путем указания типа документа и имени документа. Аргумент Force=1 гарантирует принудительное удаление документа в обход правил проверки и проверок при необходимости.
frappe.db.commit(): После удаления всех документов изменения в базе данных фиксируются, что делает удаления постоянными.
return f «Все документы из {doctype} были удалены».: после удаления всех документов возвращается сообщение об успешном завершении операции.
Эта функция полезна, когда вам нужно удалить все документы определенного типа документа в приложении Frappe.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3