From 651afaaea76c1ec868402cdd7106ec8b2de76254 Mon Sep 17 00:00:00 2001 From: Eugene Toder Date: Tue, 22 Aug 2023 11:17:25 -0400 Subject: [PATCH] Allow using Enum with length=None Fixes: #10269 --- lib/sqlalchemy/sql/sqltypes.py | 12 ++++++++---- test/sql/test_types.py | 6 ++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/sqlalchemy/sql/sqltypes.py b/lib/sqlalchemy/sql/sqltypes.py index 2ed4c8b209..fe6386f22e 100644 --- a/lib/sqlalchemy/sql/sqltypes.py +++ b/lib/sqlalchemy/sql/sqltypes.py @@ -1451,7 +1451,11 @@ class Enum(String, SchemaType, Emulated, TypeEngine[Union[str, enum.Enum]]): self._default_length = length = 0 if length_arg is not NO_ARG: - if not _disable_warnings and length_arg < length: + if ( + not _disable_warnings + and length_arg is not None + and length_arg < length + ): raise ValueError( "When provided, length must be larger or equal" " than the length of the longest enum value. %s < %s" @@ -1658,14 +1662,14 @@ class Enum(String, SchemaType, Emulated, TypeEngine[Union[str, enum.Enum]]): ) def as_generic(self, allow_nulltype=False): - if hasattr(self, "enums"): + try: args = self.enums - else: + except AttributeError: raise NotImplementedError( "TypeEngine.as_generic() heuristic " "is undefined for types that inherit Enum but do not have " "an `enums` attribute." - ) + ) from None return util.constructor_copy( self, self._generic_type_affinity, *args, _disable_warnings=True diff --git a/test/sql/test_types.py b/test/sql/test_types.py index b980d75e8c..eb91d9c4cd 100644 --- a/test/sql/test_types.py +++ b/test/sql/test_types.py @@ -2723,6 +2723,12 @@ class EnumTest(AssertsCompiledSQL, fixtures.TablesTest): e = Enum("x", "y", "long", native_enum=False, length=42) eq_(e.length, 42) + def test_none_length_non_native(self): + e = Enum("x", "y", native_enum=False, length=None) + eq_(e.length, None) + eq_(repr(e), "Enum('x', 'y', native_enum=False, length=None)") + self.assert_compile(e, "VARCHAR", dialect="default") + def test_omit_aliases(self, connection): table0 = self.tables["stdlib_enum_table"] type0 = table0.c.someenum.type -- 2.47.3