diff --git a/frappe/__init__.py b/frappe/__init__.py index 6b50f8ab28..c22899788e 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -267,7 +267,7 @@ def destroy(): # memcache redis_server = None def cache(): - """Returns memcache connection.""" + """Returns redis connection.""" global redis_server if not redis_server: from frappe.utils.redis_wrapper import RedisWrapper @@ -290,6 +290,9 @@ def errprint(msg): error_log.append({"exc": msg}) +def print_sql(enable=True): + return cache().set_value('print_sql', enable) + def log(msg): """Add to `debug_log`. diff --git a/frappe/database/database.py b/frappe/database/database.py index 101b97c915..374b61db16 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -134,6 +134,8 @@ class Database(object): if debug: time_start = time() + self.log_query(query, values, debug, explain) + if values!=(): if isinstance(values, dict): values = dict(values) @@ -142,41 +144,18 @@ class Database(object): if not isinstance(values, (dict, tuple, list)): values = (values,) - if debug and query.strip().lower().startswith('select'): - try: - if explain: - self.explain_query(query, values) - frappe.errprint(query % values) - except TypeError: - frappe.errprint([query, values]) - if (frappe.conf.get("logging") or False)==2: - frappe.log("<<<< query") - frappe.log(query) - frappe.log("with values:") - frappe.log(values) - frappe.log(">>>>") self._cursor.execute(query, values) if frappe.flags.in_migrate: self.log_touched_tables(query, values) else: - if debug: - if explain: - self.explain_query(query) - frappe.errprint(query) - if (frappe.conf.get("logging") or False)==2: - frappe.log("<<<< query") - frappe.log(query) - frappe.log(">>>>") - self._cursor.execute(query) if frappe.flags.in_migrate: self.log_touched_tables(query) if debug: - frappe.errprint(self._cursor.mogrify(query, values)) time_end = time() frappe.errprint(("Execution time: {0} sec").format(round(time_end - time_start, 2))) @@ -213,6 +192,27 @@ class Database(object): else: return self._cursor.fetchall() + def log_query(self, query, values, debug, explain): + # for debugging in tests + if frappe.flags.in_test and frappe.cache().get_value('print_sql'): + print(self._cursor.mogrify(query, values)) + + # debug + if debug: + if explain and query.strip().lower().startswith('select'): + self.explain_query(query, values) + frappe.errprint(self._cursor.mogrify(query, values)) + + # info + if (frappe.conf.get("logging") or False)==2: + frappe.log("<<<< query") + frappe.log(query) + if values: + frappe.log("with values:") + frappe.log(values) + frappe.log(">>>>") + + def explain_query(self, query, values=None): """Print `EXPLAIN` in error log.""" try: diff --git a/frappe/event_streaming/doctype/event_producer/test_event_producer.py b/frappe/event_streaming/doctype/event_producer/test_event_producer.py index f7a6b54399..441d0d492d 100644 --- a/frappe/event_streaming/doctype/event_producer/test_event_producer.py +++ b/frappe/event_streaming/doctype/event_producer/test_event_producer.py @@ -206,8 +206,10 @@ class TestEventProducer(unittest.TestCase): def test_inner_mapping(self): producer = get_remote_site() + frappe.print_sql(True) try: setup_event_producer_for_inner_mapping() + frappe.print_sql(False) except frappe.TimestampMismatchError: # retry - event_producer keeps updating last_updated # so retry if it fails the first time due to a background event