diff --git a/frappe/database/database.py b/frappe/database/database.py index 5ca06f7dc6..444c46d586 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -857,7 +857,7 @@ class Database: :param modified_by: Set this user as `modified_by`. :param update_modified: default True. Set as false, if you don't want to update the timestamp. :param debug: Print the query in the developer / js console. - :param for_update: Will add a row-level lock to the value that is being set so that it can be released on commit. + :param for_update: [DEPRECATED] This function now performs updates in single query, locking is not required. """ is_single_doctype = not (dn and dt != dn) to_update = field if isinstance(field, dict) else {field: val} @@ -880,10 +880,14 @@ class Database: else: query = frappe.qb.engine.build_conditions(table=dt, filters=dn, update=True) - # TODO: Fix this; doesn't work rn - gavin@frappe.io - # frappe.cache().hdel_keys(dt, "document_cache") - # Workaround: clear all document caches - frappe.cache().delete_value("document_cache") + + if isinstance(dn, str): + frappe.clear_document_cache(dt, dn) + else: + # TODO: Fix this; doesn't work rn - gavin@frappe.io + # frappe.cache().hdel_keys(dt, "document_cache") + # Workaround: clear all document caches + frappe.cache().delete_value("document_cache") for column, value in to_update.items(): query = query.set(column, value) diff --git a/frappe/tests/test_db.py b/frappe/tests/test_db.py index 165d877e3c..df698530f9 100644 --- a/frappe/tests/test_db.py +++ b/frappe/tests/test_db.py @@ -735,7 +735,7 @@ class TestDBSetValue(FrappeTestCase): frappe.db.get_value("ToDo", todo.name, ["modified", "modified_by"]), ) - def test_for_update(self): + def test_set_value(self): self.todo1.reload() with patch.object(Database, "sql") as sql_called: @@ -746,28 +746,23 @@ class TestDBSetValue(FrappeTestCase): f"{self.todo1.description}-edit by `test_for_update`", ) first_query = sql_called.call_args_list[0].args[0] - second_query = sql_called.call_args_list[1].args[0] - self.assertTrue(sql_called.call_count == 2) - self.assertTrue("FOR UPDATE" in first_query) if frappe.conf.db_type == "postgres": from frappe.database.postgres.database import modify_query - self.assertTrue(modify_query("UPDATE `tabToDo` SET") in second_query) + self.assertTrue(modify_query("UPDATE `tabToDo` SET") in first_query) if frappe.conf.db_type == "mariadb": - self.assertTrue("UPDATE `tabToDo` SET" in second_query) + self.assertTrue("UPDATE `tabToDo` SET" in first_query) def test_cleared_cache(self): self.todo2.reload() + frappe.get_cached_doc(self.todo2.doctype, self.todo2.name) # init cache - with patch.object(frappe, "clear_document_cache") as clear_cache: - frappe.db.set_value( - self.todo2.doctype, - self.todo2.name, - "description", - f"{self.todo2.description}-edit by `test_cleared_cache`", - ) - clear_cache.assert_called() + description = f"{self.todo2.description}-edit by `test_cleared_cache`" + + frappe.db.set_value(self.todo2.doctype, self.todo2.name, "description", description) + cached_doc = frappe.get_cached_doc(self.todo2.doctype, self.todo2.name) + self.assertEqual(cached_doc.description, description) def test_update_alias(self): args = (self.todo1.doctype, self.todo1.name, "description", "Updated by `test_update_alias`")