我正在使用
mysql-connector-python==9.0.0
并且需要一个自定义光标类。默认情况下,我使用:
cursor = db.cursor(dictionary=True)
这会将数据作为字典而不是元组(这是默认值)返回,因为它是我的应用程序所必需的。问题是当我使用时:
cursor = db.cursor(cursor_class=LoggingCursor, dictionary=True)
忽略
dictionary
属性,数据以元组形式返回。
这是我的
LoggingCursor
课程:
class LoggingCursor(CMySQLCursor):
def __init__(self, *args, **kwargs):
print(*args)
super(LoggingCursor, self).__init__(*args, **kwargs)
self.executed_statements: list[str] = []
def execute(self, operation, params=(), multi=False):
result = super(LoggingCursor, self).execute(operation, params, multi)
self.executed_statements.append(self.statement)
return result
def executemany(self, operation, seq_params):
result = super(LoggingCursor, self).executemany(operation, seq_params)
for _ in seq_params:
self.executed_statements.append(self.statement)
return result
@property
def all_executed_statements(self):
return self.executed_statements
请注意,我需要使用光标 C 扩展,因为如果我使用
mysql.connector.cursor.MySQLCursor
(这是默认类),我会收到此错误:
mysql.connector.errors.ProgrammingError: Cursor class needs to be a subclass of cursor_cext.CMySQLCursor
那么,在使用自定义游标类时如何将结果作为字典返回?
mysql_connector
有CMySQLCursorDict
课程。您需要使用它才能将结果作为字典返回。
class LoggingCursor(CMySQLCursorDict):
pass
cursor = db.cursor(cursor_class=LoggingCursor)
我在这个gist中添加了完整的代码。