﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
4465	Invalid sql string formatting (TypeError) if sql contains '%' signs in /django/db/backends/util.py	Vadim Fint	Adrian Holovaty	"I have tested 0.96 version, but all files which I tweak are the same in SVN version as in 0.96.

Well, perhaps, tupo:

LIB/django/db/backends/util.py
{{{
#!python

class CursorDebugWrapper(object):
...
    def execute(self, sql, params=()):
        start = time()
        try:
            return self.cursor.execute(sql, params)
        finally:
            stop = time()
            # If params was a list, convert it to a tuple, because string
            # formatting with '%' only works with tuples or dicts.
            if not isinstance(params, (tuple, dict)):
                params = tuple(params)
            self.db.queries.append({
                'sql': sql % params,
                'time': ""%.3f"" % (stop - start),
            })

}}}

if sql contains any '%' characters, but params is empty list - we will have ""TypeError: not enough arguments for format string"" here.

This errors occurs for me than I have custom init SQL for models containing '%' sign. So we need fix LIB/django/core/management.py

 1. Fix get_custom_sql_for_model() function
 2. Fix reset() function (source:/django/trunk/django/core/management.py@5355#L661)

I suppose you must fix the second one, just 

But, probably this is better? (LIB/django/db/backends/util.py)
{{{
#!python
class CursorDebugWrapper(object):
...
    def execute(self, sql, params = None):
        start = time()
        try:
            return self.cursor.execute(sql, params)
        finally:
            stop = time()

            # We only try param substitution if have any params
            if params is not None:
                # If params was a list, convert it to a tuple, because string
                # formatting with '%' only works with tuples or dicts.
                if not isinstance(params, (tuple, dict)):
                    params = tuple(params)
                sql = sql % params

            self.db.queries.append({
                'sql': sql,
                'time': ""%.3f"" % (stop - start),
            })
}}}

When passing params=None to cursor, I think, cursor will do this check automatically (for example, MySQLDb.cursors.BaseCursor.execute() do). After that fix, all works perfect. Again. :).

btw, great framework, thanks guys!"		closed	Database layer (models, ORM)	0.96		duplicate		mocksoul@…	Unreviewed	0	0	0	0	0	0
