From 5879182106249f7e1a0bacf1b5cb141ecdb3eb02 Mon Sep 17 00:00:00 2001 From: Nikolay Makhalin Date: Sat, 20 Dec 2025 00:21:06 +0100 Subject: [PATCH 1/2] Support for `sa.BINARY` and `sa.BLOB` types --- test/test_suite.py | 1 - ydb_sqlalchemy/sqlalchemy/__init__.py | 3 +++ ydb_sqlalchemy/sqlalchemy/compiler/base.py | 2 +- ydb_sqlalchemy/sqlalchemy/types.py | 21 +++++++++++++++++++-- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/test/test_suite.py b/test/test_suite.py index e0e8550..5ef403a 100644 --- a/test/test_suite.py +++ b/test/test_suite.py @@ -274,7 +274,6 @@ class NumericTest(_NumericTest): pass -@pytest.mark.skip("TODO: see issue #13") class BinaryTest(_BinaryTest): pass diff --git a/ydb_sqlalchemy/sqlalchemy/__init__.py b/ydb_sqlalchemy/sqlalchemy/__init__.py index 62875cb..ca5fae2 100644 --- a/ydb_sqlalchemy/sqlalchemy/__init__.py +++ b/ydb_sqlalchemy/sqlalchemy/__init__.py @@ -157,6 +157,9 @@ class YqlDialect(StrCompileDialect): sa.types.DATETIME: types.YqlDateTime, sa.types.TIMESTAMP: types.YqlTimestamp, sa.types.DECIMAL: types.Decimal, + sa.types.BINARY: types.Binary, + sa.types.LargeBinary: types.Binary, + sa.types.BLOB: types.Binary, } connection_characteristics = util.immutabledict( diff --git a/ydb_sqlalchemy/sqlalchemy/compiler/base.py b/ydb_sqlalchemy/sqlalchemy/compiler/base.py index 9833139..fcf2ec5 100644 --- a/ydb_sqlalchemy/sqlalchemy/compiler/base.py +++ b/ydb_sqlalchemy/sqlalchemy/compiler/base.py @@ -216,7 +216,7 @@ def get_ydb_type( ydb_type = ydb.PrimitiveType.Timestamp elif isinstance(type_, sa.Date): ydb_type = ydb.PrimitiveType.Date - elif isinstance(type_, sa.BINARY): + elif isinstance(type_, (sa.BINARY, sa.LargeBinary, types.Binary)): ydb_type = ydb.PrimitiveType.String elif isinstance(type_, sa.Float): ydb_type = ydb.PrimitiveType.Float diff --git a/ydb_sqlalchemy/sqlalchemy/types.py b/ydb_sqlalchemy/sqlalchemy/types.py index 89c43d0..8ee2e6e 100644 --- a/ydb_sqlalchemy/sqlalchemy/types.py +++ b/ydb_sqlalchemy/sqlalchemy/types.py @@ -11,7 +11,14 @@ from sqlalchemy import ARRAY, exc, types from sqlalchemy.sql import type_api -from .datetime_types import YqlDate, YqlDateTime, YqlTimestamp, YqlDate32, YqlTimestamp64, YqlDateTime64 # noqa: F401 +from .datetime_types import ( + YqlDate, + YqlDateTime, + YqlTimestamp, + YqlDate32, + YqlTimestamp64, + YqlDateTime64, +) # noqa: F401 from .json import YqlJSON # noqa: F401 @@ -119,7 +126,10 @@ def __hash__(self): class StructType(types.TypeEngine[Mapping[str, Any]]): __visit_name__ = "struct_type" - def __init__(self, fields_types: Mapping[str, Union[Type[types.TypeEngine], Type[types.TypeDecorator]]]): + def __init__( + self, + fields_types: Mapping[str, Union[Type[types.TypeEngine], Type[types.TypeDecorator]]], + ): self.fields_types = HashableDict(dict(sorted(fields_types.items()))) @property @@ -139,3 +149,10 @@ def __init__(self, func): self.type = type_api.NULLTYPE self.func = func + + +class Binary(types.LargeBinary): + __visit_name__ = "BINARY" + + def bind_processor(self, dialect): + return None From 3531ca7d0f1ea0ca9c1d43527db3cb72c29959e2 Mon Sep 17 00:00:00 2001 From: Nikolay Makhalin Date: Sat, 20 Dec 2025 00:23:54 +0100 Subject: [PATCH 2/2] revert format --- ydb_sqlalchemy/sqlalchemy/types.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/ydb_sqlalchemy/sqlalchemy/types.py b/ydb_sqlalchemy/sqlalchemy/types.py index 8ee2e6e..57b9dec 100644 --- a/ydb_sqlalchemy/sqlalchemy/types.py +++ b/ydb_sqlalchemy/sqlalchemy/types.py @@ -11,14 +11,7 @@ from sqlalchemy import ARRAY, exc, types from sqlalchemy.sql import type_api -from .datetime_types import ( - YqlDate, - YqlDateTime, - YqlTimestamp, - YqlDate32, - YqlTimestamp64, - YqlDateTime64, -) # noqa: F401 +from .datetime_types import YqlDate, YqlDateTime, YqlTimestamp, YqlDate32, YqlTimestamp64, YqlDateTime64 # noqa: F401 from .json import YqlJSON # noqa: F401 @@ -126,10 +119,7 @@ def __hash__(self): class StructType(types.TypeEngine[Mapping[str, Any]]): __visit_name__ = "struct_type" - def __init__( - self, - fields_types: Mapping[str, Union[Type[types.TypeEngine], Type[types.TypeDecorator]]], - ): + def __init__(self, fields_types: Mapping[str, Union[Type[types.TypeEngine], Type[types.TypeDecorator]]]): self.fields_types = HashableDict(dict(sorted(fields_types.items()))) @property