我正在尝试将DictCursor与with
块一起使用。我认为通过使用:
with MySQLdb.connect(...) as c:
c
将是一个连接对象,因为这就是 connect() 返回的内容。但很可惜,事实并非如此!突然,c
是一个光标!虽然这通常很方便,但我真的很喜欢使用DictCursor
- 这根本不是这样设计的吗?将 DictCursor 包含为“作用域对象”会导致错误(__exit__
未定义)
我正在尝试将DictCursor与with
块一起使用。我认为通过使用:
with MySQLdb.connect(...) as c:
c
将是一个连接对象,因为这就是 connect() 返回的内容。但很可惜,事实并非如此!突然,c
是一个光标!虽然这通常很方便,但我真的很喜欢使用DictCursor
- 这根本不是这样设计的吗?将 DictCursor 包含为“作用域对象”会导致错误(__exit__
未定义)
根据 MySQLdb 中 Connection 的定义,这里第 254 行的 connections.py, Connection.cursor() 将返回一个 Connection.cursorclass 的实例:
def cursor(self, cursorclass=None):
"""
Create a cursor on which queries may be performed. The
optional cursorclass parameter is used to create the
Cursor. By default, self.cursorclass=cursors.Cursor is
used.
"""
return (cursorclass or self.cursorclass)(self)
所以,我猜如果您使用参数“cursorclass”初始化连接,并将其设置为 MySQLdb.cursors.DictCursor,例如:
dbconn = MySQLdb.connect(cursorclass=MySQLdb.cursors.DictCursor)
当谈到
def __enter__(self):
if self.get_autocommit():
self.query("BEGIN")
return self.cursor()
它将返回一个字典光标。
c
是一个游标,因为这是从__enter__
上下文管理器的方法返回的内容。
如果您浏览 Mysqldb 的源代码,您将能够看到line 245 of connections.py
:
def __enter__(self): return self.cursor()
至于DictCursor
,它不支持上下文管理。
我用 sqlalchemy 修复原始 sql
if self.engine.url.drivername == 'mysql+pymysql':
from pymysql.cursors import SSDictCursor
connection = self.engine.raw_connection()
cursor = connection.cursor(cursor=SSDictCursor)
elif self.engine.url.drivername == 'mysql+mysqldb':
import MySQLdb.cursors
connection = self.engine.raw_connection()
cursor = connection.cursor(cursorclass=MySQLdb.cursors.DictCursor)
else:
connection = self.engine.raw_connection()
cursor = connection.cursor()
或在创建连接时使用
connect_args=dict(cursorclass=MySQLdb.cursors.DictCursor)