def pt_visual_explain(queryset, display=True): if not have_program("pt-visual-explain"): # pragma: no cover raise OSError("pt-visual-explain doesn't appear to be installed") connection = connections[queryset.db] capturer = CaptureQueriesContext(connection) with capturer, connection.cursor() as cursor: sql, params = queryset.query.sql_with_params() cursor.execute("EXPLAIN " + sql, params) queries = [q["sql"] for q in capturer.captured_queries] # Take the last - django may have just opened up a connection in which # case it would have run initialization command[s] explain_query = queries[-1] # Now do the explain and pass through pt-visual-explain mysql_command = settings_to_cmd_args(connection.settings_dict) + [ "-e", explain_query, ] mysql = subprocess.Popen(mysql_command, stdout=subprocess.PIPE) visual_explain = subprocess.Popen(["pt-visual-explain", "-"], stdin=mysql.stdout, stdout=subprocess.PIPE) mysql.stdout.close() explanation = visual_explain.communicate()[0].decode(encoding="utf-8") if display: print(explanation) else: return explanation
def pt_visual_explain(queryset, display=True): if not have_program('pt-visual-explain'): # pragma: no cover raise OSError("pt-visual-explain doesn't appear to be installed") connection = connections[queryset.db] capturer = CaptureQueriesContext(connection) with capturer, connection.cursor() as cursor: sql, params = queryset.query.sql_with_params() cursor.execute('EXPLAIN ' + sql, params) queries = [q['sql'] for q in capturer.captured_queries] # Take the last - django may have just opened up a connection in which # case it would have run initialization command[s] explain_query = queries[-1] # Now do the explain and pass through pt-visual-explain mysql_command = ( settings_to_cmd_args(connection.settings_dict) + ['-e', explain_query] ) mysql = Popen(mysql_command, stdout=PIPE) visual_explain = Popen( ['pt-visual-explain', '-'], stdin=mysql.stdout, stdout=PIPE ) mysql.stdout.close() explanation = visual_explain.communicate()[0].decode(encoding="utf-8") if display: print(explanation) else: return explanation
def pt_visual_explain(queryset: models.QuerySet, display: bool = True) -> str: connection = connections[queryset.db] capturer = CaptureQueriesContext(connection) with capturer, connection.cursor() as cursor: sql, params = queryset.query.sql_with_params() cursor.execute("EXPLAIN " + sql, params) queries = [q["sql"] for q in capturer.captured_queries] # Take the last - django may have just opened up a connection in which # case it would have run initialization command[s] explain_query = queries[-1] # Now do the explain and pass through pt-visual-explain mysql_command = settings_to_cmd_args(connection.settings_dict) + [ "-e", explain_query, ] mysql = subprocess.Popen(mysql_command, stdout=subprocess.PIPE) visual_explain = subprocess.Popen(["pt-visual-explain", "-"], stdin=mysql.stdout, stdout=subprocess.PIPE) assert mysql.stdout is not None mysql.stdout.close() explanation = visual_explain.communicate()[0].decode(encoding="utf-8") mysql.wait() if display: print(explanation) return explanation
def output_for_mysql(self, settings_dict): args = settings_to_cmd_args(settings_dict) args = args[1:] # Delete the 'mysql' at the start self.stdout.write(" ".join(args), ending="")