Categories

Links

django小提示-打印sql语句

当settings.Debug=True时,django 使用的是django.db.backets.util.CursorDebugWrapper ,这样,当你执行execute,executemany时,django会把你执行的语句加入到BaseDatabaseWrapper派生对象的queries列表,每次加入的是一个dict,包括sql和time
这样,你可以在任何时候打印connection对象的queries属性或是直接在CursorDebugWrapper的execute和executemany中加入print语句

def execute(....):
    ...
    print smart_unicode(sql) % convert_args(params),"%.3f" % (stop - start)

在django中connection对象实际上就是BaseDatabaseWrapper的派生类
看这行
connection = backend.DatabaseWrapper(**settings.DATABASE_OPTIONS)

再看backend模块是怎么来的
    _import_path = 'django.db.backends.'
    backend = __import__('%s%s.base' % (_import_path, settings.DATABASE_ENGINE), {}, {}, [''])

显然,如果你的DATABASE_ENGINE为mysql的话,这个导入语句就是
__import("django.db.backends.mysql.base",{},{},[''])

通常,mysqldb的cursor执行结果为一个tuple ,虽然这样效率较高,但有时 也不方便,你可以让 在创建真实的mysqldb connection对象时传入cursorclass参数

修改django.db.backends.mysql.base.DatabaseWrapper
def _cursor(...):
            #keargs['cursorclass']=Database.DictCursor # 加上这行
            self.connection = Database.connect(**kwargs)

或者在settings.py中增加
import MySQLdb
CURSOR_CLASS=MySQLdb.Cusor # 或者CURSOR_CLASS=MySQLdb.DictCursor

然后
def _cursor(...):
           keargs['cursorclass']=settings.CURSOR_CLASS # 加上这行
            self.connection = Database.connect(**kwargs)

你也可以修改
  cursor = self.connection.cursor() 为
  cursor = self.connection.cursor(settings.CURSOR_CLASS)
效果是一样的

[2007-11-28 11:05:03 | jiangjianxiao]

comments


Powered by Google App Engine