diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2022-01-21 01:26:02 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@ci3.zzzcomputing.com> | 2022-01-21 01:26:02 +0000 |
| commit | f8a13c3dc751123eeefa2b475916a74aab99f023 (patch) | |
| tree | 59e0c8cc1b5b8c115f7ae5fb193522292a44b848 | |
| parent | 1a24813bab99376ccd1c726dd7b69db3635a2d2b (diff) | |
| parent | 469f7fd2f3d51796904cde63dfcc2aafe5663087 (diff) | |
| download | sqlalchemy-f8a13c3dc751123eeefa2b475916a74aab99f023.tar.gz | |
Merge "re-enable tests for asyncmy; fix Binary" into main
| -rw-r--r-- | doc/build/changelog/unreleased_14/7593.rst | 7 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/mysql/asyncmy.py | 12 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/mysql/mariadbconnector.py | 11 | ||||
| -rw-r--r-- | lib/sqlalchemy/testing/suite/test_types.py | 39 | ||||
| -rw-r--r-- | test/requirements.py | 14 | ||||
| -rw-r--r-- | tox.ini | 2 |
6 files changed, 77 insertions, 8 deletions
diff --git a/doc/build/changelog/unreleased_14/7593.rst b/doc/build/changelog/unreleased_14/7593.rst new file mode 100644 index 000000000..ebb3406ed --- /dev/null +++ b/doc/build/changelog/unreleased_14/7593.rst @@ -0,0 +1,7 @@ +.. change:: + :tags: bug, mysql, regression + :tickets: 7593 + + Fixed regression in asyncmy dialect caused by :ticket:`7567` where removal + of the PyMySQL dependency broke binary columns, due to the asyncmy dialect + not being properly included within CI tests. diff --git a/lib/sqlalchemy/dialects/mysql/asyncmy.py b/lib/sqlalchemy/dialects/mysql/asyncmy.py index 3eb19411e..915b666bb 100644 --- a/lib/sqlalchemy/dialects/mysql/asyncmy.py +++ b/lib/sqlalchemy/dialects/mysql/asyncmy.py @@ -229,6 +229,11 @@ class AsyncAdaptFallback_asyncmy_connection(AsyncAdapt_asyncmy_connection): await_ = staticmethod(await_fallback) +def _Binary(x): + """Return x as a binary type.""" + return bytes(x) + + class AsyncAdapt_asyncmy_dbapi: def __init__(self, asyncmy): self.asyncmy = asyncmy @@ -251,6 +256,13 @@ class AsyncAdapt_asyncmy_dbapi: ): setattr(self, name, getattr(self.asyncmy.errors, name)) + STRING = util.symbol("STRING") + NUMBER = util.symbol("NUMBER") + BINARY = util.symbol("BINARY") + DATETIME = util.symbol("DATETIME") + TIMESTAMP = util.symbol("TIMESTAMP") + Binary = staticmethod(_Binary) + def connect(self, *arg, **kw): async_fallback = kw.pop("async_fallback", False) diff --git a/lib/sqlalchemy/dialects/mysql/mariadbconnector.py b/lib/sqlalchemy/dialects/mysql/mariadbconnector.py index f31304887..ea6060c01 100644 --- a/lib/sqlalchemy/dialects/mysql/mariadbconnector.py +++ b/lib/sqlalchemy/dialects/mysql/mariadbconnector.py @@ -163,22 +163,21 @@ class MySQLDialect_mariadbconnector(MySQLDialect): def _detect_charset(self, connection): return "utf8mb4" - _isolation_lookup = set( - [ + def get_isolation_level_values(self, dbapi_connection): + return ( "SERIALIZABLE", "READ UNCOMMITTED", "READ COMMITTED", "REPEATABLE READ", "AUTOCOMMIT", - ] - ) + ) - def _set_isolation_level(self, connection, level): + def set_isolation_level(self, connection, level): if level == "AUTOCOMMIT": connection.autocommit = True else: connection.autocommit = False - super(MySQLDialect_mariadbconnector, self)._set_isolation_level( + super(MySQLDialect_mariadbconnector, self).set_isolation_level( connection, level ) diff --git a/lib/sqlalchemy/testing/suite/test_types.py b/lib/sqlalchemy/testing/suite/test_types.py index c51a66690..94bab009a 100644 --- a/lib/sqlalchemy/testing/suite/test_types.py +++ b/lib/sqlalchemy/testing/suite/test_types.py @@ -42,6 +42,8 @@ from ... import Unicode from ... import UnicodeText from ...orm import declarative_base from ...orm import Session +from ...sql.sqltypes import LargeBinary +from ...sql.sqltypes import PickleType class _LiteralRoundTripFixture: @@ -193,6 +195,42 @@ class UnicodeTextTest(_UnicodeFixture, fixtures.TablesTest): self._test_null_strings(connection) +class BinaryTest(_LiteralRoundTripFixture, fixtures.TablesTest): + __requires__ = ("binary_literals",) + __backend__ = True + + @classmethod + def define_tables(cls, metadata): + Table( + "binary_table", + metadata, + Column( + "id", Integer, primary_key=True, test_needs_autoincrement=True + ), + Column("binary_data", LargeBinary), + Column("pickle_data", PickleType), + ) + + def test_binary_roundtrip(self, connection): + binary_table = self.tables.binary_table + + connection.execute( + binary_table.insert(), {"id": 1, "binary_data": b"this is binary"} + ) + row = connection.execute(select(binary_table.c.binary_data)).first() + eq_(row, (b"this is binary",)) + + def test_pickle_roundtrip(self, connection): + binary_table = self.tables.binary_table + + connection.execute( + binary_table.insert(), + {"id": 1, "pickle_data": {"foo": [1, 2, 3], "bar": "bat"}}, + ) + row = connection.execute(select(binary_table.c.pickle_data)).first() + eq_(row, ({"foo": [1, 2, 3], "bar": "bat"},)) + + class TextTest(_LiteralRoundTripFixture, fixtures.TablesTest): __requires__ = ("text_type",) __backend__ = True @@ -1553,6 +1591,7 @@ class JSONLegacyStringCastIndexTest( __all__ = ( + "BinaryTest", "UnicodeVarcharTest", "UnicodeTextTest", "JSONTest", diff --git a/test/requirements.py b/test/requirements.py index b42bab7d3..cfd11f3ba 100644 --- a/test/requirements.py +++ b/test/requirements.py @@ -1054,7 +1054,19 @@ class DefaultRequirements(SuiteRequirements): a plain string. """ - return exclusions.fails_on(["mysql", "mariadb"]) + + # mariadbconnector works. pyodbc we dont know, not supported in + # testing. + return exclusions.fails_on( + [ + "+mysqldb", + "+pymysql", + "+asyncmy", + "+mysqlconnector", + "+cymysql", + "+aiomysql", + ] + ) @property def datetime_timezone(self): @@ -105,7 +105,7 @@ setenv= py2{,7}-mysql: MYSQL={env:TOX_MYSQL_PY2K:{env:TOX_MYSQL:--db mysql}} mysql: EXTRA_MYSQL_DRIVERS={env:EXTRA_MYSQL_DRIVERS:--dbdriver mysqldb --dbdriver pymysql} - py3-mysql: EXTRA_MYSQL_DRIVERS={env:EXTRA_MYSQL_DRIVERS:--dbdriver mysqldb --dbdriver pymysql --dbdriver mariadbconnector --dbdriver asyncmy} + py3{,7,8,9,10,11}-mysql: EXTRA_MYSQL_DRIVERS={env:EXTRA_MYSQL_DRIVERS:--dbdriver mysqldb --dbdriver pymysql --dbdriver mariadbconnector --dbdriver asyncmy} mssql: MSSQL={env:TOX_MSSQL:--db mssql} |
