当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) 效果是一样的 |