Avoid deleting attributes of DB driver modules.

Fixes #206.
This commit is contained in:
Jason Madden 2019-01-07 08:20:53 -06:00
parent a821ec1147
commit f80e53aa2d
No known key found for this signature in database
GPG Key ID: 349F84431A08B99E
3 changed files with 21 additions and 19 deletions

View File

@ -44,7 +44,8 @@ disable=wrong-import-position,
redefined-builtin, redefined-builtin,
useless-suppression, useless-suppression,
duplicate-code, duplicate-code,
inconsistent-return-statements inconsistent-return-statements,
useless-object-inheritance
# undefined-all-variable # undefined-all-variable

View File

@ -6,7 +6,8 @@
2.1.1 (unreleased) 2.1.1 (unreleased)
================== ==================
- Nothing changed yet. - Avoid deleting attributes of DB driver modules we import. Fixes
:issue:`206` reported by Josh Zuech.
2.1.0 (2018-02-07) 2.1.0 (2018-02-07)

View File

@ -78,7 +78,7 @@ try:
except ImportError: except ImportError:
pass pass
else: # pragma: no cover else: # pragma: no cover
import pymysql.err from pymysql import err as pymysql_err
@implementer(IDBDriver) @implementer(IDBDriver)
class PyMySQLDriver(AbstractDriver): class PyMySQLDriver(AbstractDriver):
@ -91,9 +91,9 @@ else: # pragma: no cover
# It can also raise a DatabaseError, and sometimes # It can also raise a DatabaseError, and sometimes
# an IOError doesn't get mapped to a type # an IOError doesn't get mapped to a type
close_exceptions += ( close_exceptions += (
pymysql.err.Error, pymysql_err.Error,
IOError, IOError,
pymysql.err.DatabaseError pymysql_err.DatabaseError
) )
disconnected_exceptions += ( disconnected_exceptions += (
@ -101,32 +101,32 @@ else: # pragma: no cover
# This one has only been seen as its subclass, # This one has only been seen as its subclass,
# InternalError, as (0, 'Socket receive buffer full'), # InternalError, as (0, 'Socket receive buffer full'),
# which should probably be taken as disconnect # which should probably be taken as disconnect
pymysql.err.DatabaseError, pymysql_err.DatabaseError,
) )
connect = staticmethod(pymysql.connect) connect = staticmethod(pymysql.connect)
Binary = staticmethod(pymysql.Binary) Binary = staticmethod(pymysql.Binary)
if getattr(sys, 'pypy_version_info', (9, 9, 9)) < (5, 3, 1): if getattr(sys, 'pypy_version_info', (9, 9, 9)) < (5, 3, 1):
import pymysql.converters from pymysql import converters
# PyPy up through 5.3.0 has a bug that raises spurious # PyPy up through 5.3.0 has a bug that raises spurious
# MemoryErrors when run under PyMySQL >= 0.7. # MemoryErrors when run under PyMySQL >= 0.7.
# (https://bitbucket.org/pypy/pypy/issues/2324/bytearray-replace-a-bc-raises-memoryerror) # (https://bitbucket.org/pypy/pypy/issues/2324/bytearray-replace-a-bc-raises-memoryerror)
# (This is fixed in 5.3.1) # (This is fixed in 5.3.1)
# Patch around it. # Patch around it.
if hasattr(pymysql.converters, 'escape_string'): if hasattr(converters, 'escape_string'):
orig_escape_string = pymysql.converters.escape_string orig_escape_string = converters.escape_string
def escape_string(value, mapping=None): def escape_string(value, mapping=None):
if isinstance(value, bytearray) and not value: if isinstance(value, bytearray) and not value:
return value return value
return orig_escape_string(value, mapping) return orig_escape_string(value, mapping)
pymysql.converters.escape_string = escape_string converters.escape_string = escape_string
del pymysql.converters del converters
del pymysql.err del pymysql_err
del pymysql del pymysql
driver = PyMySQLDriver() driver = PyMySQLDriver()
@ -138,7 +138,7 @@ else: # pragma: no cover
del driver del driver
try: try:
import mysql.connector import mysql.connector as mysql_connector
except ImportError: except ImportError:
pass pass
else: else:
@ -149,12 +149,12 @@ else:
__name__ = "MySQL Connector/Python" __name__ = "MySQL Connector/Python"
disconnected_exceptions, close_exceptions, lock_exceptions = _standard_exceptions( disconnected_exceptions, close_exceptions, lock_exceptions = _standard_exceptions(
mysql.connector) mysql_connector)
use_replica_exceptions = (mysql.connector.OperationalError,) use_replica_exceptions = (mysql_connector.OperationalError,)
Binary = staticmethod(mysql.connector.Binary) Binary = staticmethod(mysql_connector.Binary)
have_cext = mysql.connector.HAVE_CEXT have_cext = mysql_connector.HAVE_CEXT
_connect = staticmethod(mysql.connector.connect) _connect = staticmethod(mysql_connector.connect)
def connect(self, *args, **kwargs): def connect(self, *args, **kwargs):
# It defaults to the (slower) pure-python version # It defaults to the (slower) pure-python version
@ -189,7 +189,7 @@ else:
cursor = conn.cursor() cursor = conn.cursor()
return cursor return cursor
del mysql.connector del mysql_connector
driver = MySQLConnectorDriver() driver = MySQLConnectorDriver()
driver_map[driver.__name__] = driver driver_map[driver.__name__] = driver