--- /dev/null
+.. 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.
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
):
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)
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
)
from ... import UnicodeText
from ...orm import declarative_base
from ...orm import Session
+from ...sql.sqltypes import LargeBinary
+from ...sql.sqltypes import PickleType
class _LiteralRoundTripFixture:
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
__all__ = (
+ "BinaryTest",
"UnicodeVarcharTest",
"UnicodeTextTest",
"JSONTest",
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):
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}