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()调用。
在这里插入图片描述
在DBUtils.SteadyDB.connect()的调用中,实际上已经是在调用数据库连接的的方法。也就是已经在使用MySQLdb开始连接数据库了。此时的DBUtils.SteadyDB.connect()相当于MySQLdb.Connection(),SteadyDBCursor()相当于MySQLdb.Connection.cursor(),也只有这时候才可以向cursor传递参数。(见思维导图1)

在这里插入图片描述
那向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。
在这里插入图片描述
在这里插入图片描述

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值