aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Hudson2009-06-11 14:40:47 -0700
committerRob Hudson2009-06-11 14:40:47 -0700
commit0584848bb88528feb5d2b2d234848d410b1beefb (patch)
tree484c634421a62e11a02ba55fc589194eafa60b01
parent1956ee540c75f9d4226f0352df5b06aae5c02703 (diff)
downloaddjango-debug-toolbar-0584848bb88528feb5d2b2d234848d410b1beefb.tar.bz2
Adding a management command that will display the SQL generated by Django as
you use the interactive Python shell.
-rw-r--r--debug_toolbar/management/__init__.py0
-rw-r--r--debug_toolbar/management/commands/__init__.py0
-rw-r--r--debug_toolbar/management/commands/debugsqlshell.py84
3 files changed, 84 insertions, 0 deletions
diff --git a/debug_toolbar/management/__init__.py b/debug_toolbar/management/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/debug_toolbar/management/__init__.py
diff --git a/debug_toolbar/management/commands/__init__.py b/debug_toolbar/management/commands/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/debug_toolbar/management/commands/__init__.py
diff --git a/debug_toolbar/management/commands/debugsqlshell.py b/debug_toolbar/management/commands/debugsqlshell.py
new file mode 100644
index 0000000..0f2fc6a
--- /dev/null
+++ b/debug_toolbar/management/commands/debugsqlshell.py
@@ -0,0 +1,84 @@
+import os
+from optparse import make_option
+
+from django.core.management.base import NoArgsCommand
+from django.db.backends import util
+
+# Optional sqlparse to make the SQL look pretty...
+# http://code.google.com/p/python-sqlparse/
+try:
+ import sqlparse
+except ImportError:
+ sqlparse = None
+
+class PrintQueryWrapper(util.CursorDebugWrapper):
+ def execute(self, sql, params=()):
+ try:
+ return self.cursor.execute(sql, params)
+ finally:
+ raw_sql = self.db.ops.last_executed_query(self.cursor, sql, params)
+ if sqlparse:
+ print sqlparse.format(raw_sql, reindent=True)
+ else:
+ print raw_sql
+ print
+
+util.CursorDebugWrapper = PrintQueryWrapper
+
+# The rest is copy/paste from django/core/management/commands/shell.py
+
+class Command(NoArgsCommand):
+ option_list = NoArgsCommand.option_list + (
+ make_option('--plain', action='store_true', dest='plain',
+ help='Tells Django to use plain Python, not IPython.'),
+ )
+ help = "Runs a Python interactive interpreter. Tries to use IPython, if it's available."
+
+ requires_model_validation = False
+
+ def handle_noargs(self, **options):
+ # XXX: (Temporary) workaround for ticket #1796: force early loading of all
+ # models from installed apps.
+ from django.db.models.loading import get_models
+ loaded_models = get_models()
+
+ use_plain = options.get('plain', False)
+
+ try:
+ if use_plain:
+ # Don't bother loading IPython, because the user wants plain Python.
+ raise ImportError
+ import IPython
+ # Explicitly pass an empty list as arguments, because otherwise IPython
+ # would use sys.argv from this script.
+ shell = IPython.Shell.IPShell(argv=[])
+ shell.mainloop()
+ except ImportError:
+ import code
+ # Set up a dictionary to serve as the environment for the shell, so
+ # that tab completion works on objects that are imported at runtime.
+ # See ticket 5082.
+ imported_objects = {}
+ try: # Try activating rlcompleter, because it's handy.
+ import readline
+ except ImportError:
+ pass
+ else:
+ # We don't have to wrap the following import in a 'try', because
+ # we already know 'readline' was imported successfully.
+ import rlcompleter
+ readline.set_completer(rlcompleter.Completer(imported_objects).complete)
+ readline.parse_and_bind("tab:complete")
+
+ # We want to honor both $PYTHONSTARTUP and .pythonrc.py, so follow system
+ # conventions and get $PYTHONSTARTUP first then import user.
+ if not use_plain:
+ pythonrc = os.environ.get("PYTHONSTARTUP")
+ if pythonrc and os.path.isfile(pythonrc):
+ try:
+ execfile(pythonrc)
+ except NameError:
+ pass
+ # This will import .pythonrc.py as a side-effect
+ import user
+ code.interact(local=imported_objects)