python .cursor(cursorclass=MySQLdb.cursors.DictCursor)解析

数据库连接池返回结果类型设置分析

使用场景,设置数据库返回结果为字典类型:

import MySQLdb
from DBUtils.PooledDB import PooledDB

# 建立数据库连接池
pool = PooledDB(creator, maxconnections, host, user, passwd, db, port, charset)
# 实现连接
conn = pool.connection()
# 设置返回数据类型
conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)

查看PooledDB源码,pool.connection()的return返回值是PooledSharedDBConnection(con)。在方法中会经过steady_connection(),SharedDBConnection(con)方法的调用。而steady_connection()方法用到了DBUtils.SteadyDB.connect(),其中connect()的返回SteadyDBCursor()调用。
python .cursor(cursorclass=MySQLdb.cursors.DictCursor)解析_第1张图片
在DBUtils.SteadyDB.connect()的调用中,实际上已经是在调用数据库连接的的方法。也就是已经在使用MySQLdb开始连接数据库了。此时的DBUtils.SteadyDB.connect()相当于MySQLdb.Connection(),SteadyDBCursor()相当于MySQLdb.Connection.cursor(),也只有这时候才可以向cursor传递参数。(见思维导图1)

python .cursor(cursorclass=MySQLdb.cursors.DictCursor)解析_第2张图片
那向cursor传递参数,使用到的方法又有哪些呢?
查看MySQLdb.Connection()源码,子方法cursor( cursorclass=None )中的cursorclass来自kwargs2.pop(‘cursorclass’, elf.default_cursor),其中的default_cursor在一开始被赋值为cursors.Cursor(调用了MySQLdb.cursors.Cursor)。
在MySQLdb.cursors中有Cursor、DictCursor两种类型。他们的参数分别为:Cursor(CursorStoreResultMixIn, CursorTupleRowsMixIn,BaseCursor)、DictCursor(CursorStoreResultMixIn, CursorDictRowsMixIn,BaseCursor)。实际区别在于_fetch_type的赋值,Cursor()返回为0,DictCursor()返回为1。_fetch_type在MySQLdb.cursors.BaseCursor._fetch_row()中调用到该参数。_fetch_row()方法返回的是_result.fetch_row(size, self._fetch_type)。_result方法则是继承自_mysql.result()。
在_mysql.result()源码中可以看到关于_fetch_type=1时,返回的结果为dictionaries。
python .cursor(cursorclass=MySQLdb.cursors.DictCursor)解析_第3张图片
python .cursor(cursorclass=MySQLdb.cursors.DictCursor)解析_第4张图片

你可能感兴趣的:(DB)