diff --git a/cursor.py b/cursor.py index 3e6a2b4..8fa33b5 100644 --- a/cursor.py +++ b/cursor.py @@ -49,6 +49,8 @@ RE_SQL_FIND_PARAM = re.compile( _ERR_NO_RESULT_TO_FETCH = "No result set to fetch from." +NAMED_TUPLE_CACHE = weakref.WeakValueDictionary() + class _ParamSubstitutor(object): """ @@ -1201,10 +1203,13 @@ class MySQLCursorNamedTuple(MySQLCursor): """ row = self._connection.converter.row_to_python(rowdata, desc) if row: - # pylint: disable=W0201 - self.named_tuple = namedtuple('Row', self.column_names) - # pylint: enable=W0201 - return self.named_tuple(*row) + columns = tuple(self.column_names) + try: + named_tuple = NAMED_TUPLE_CACHE[columns] + except KeyError: + named_tuple = namedtuple('Row', columns) + NAMED_TUPLE_CACHE[columns] = named_tuple + return named_tuple(*row) def fetchone(self): """Returns next row of a query result set