summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2022-01-21 01:26:02 +0000
committerGerrit Code Review <gerrit@ci3.zzzcomputing.com>2022-01-21 01:26:02 +0000
commitf8a13c3dc751123eeefa2b475916a74aab99f023 (patch)
tree59e0c8cc1b5b8c115f7ae5fb193522292a44b848
parent1a24813bab99376ccd1c726dd7b69db3635a2d2b (diff)
parent469f7fd2f3d51796904cde63dfcc2aafe5663087 (diff)
downloadsqlalchemy-f8a13c3dc751123eeefa2b475916a74aab99f023.tar.gz
Merge "re-enable tests for asyncmy; fix Binary" into main
-rw-r--r--doc/build/changelog/unreleased_14/7593.rst7
-rw-r--r--lib/sqlalchemy/dialects/mysql/asyncmy.py12
-rw-r--r--lib/sqlalchemy/dialects/mysql/mariadbconnector.py11
-rw-r--r--lib/sqlalchemy/testing/suite/test_types.py39
-rw-r--r--test/requirements.py14
-rw-r--r--tox.ini2
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):
diff --git a/tox.ini b/tox.ini
index 89bac9cc2..e55a43cbb 100644
--- a/tox.ini
+++ b/tox.ini
@@ -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}