summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql
diff options
context:
space:
mode:
authorFederico Caselli <cfederico87@gmail.com>2021-03-29 22:30:49 +0200
committerMike Bayer <mike_mp@zzzcomputing.com>2021-04-01 18:55:37 -0400
commit1f31c6f36ab6dabb4696de609e9f07225b46cc13 (patch)
treefa0d304c0e18d1850bbd64abc2a4d7736209c14d /lib/sqlalchemy/sql
parent3a29d65f73c6e705f486588068172d45017285fa (diff)
downloadsqlalchemy-1f31c6f36ab6dabb4696de609e9f07225b46cc13.tar.gz
Add ``omit_aliases`` in ``Enum``.
Introduce a new parameter :paramref:`_types.Enum.omit_aliases` in :class:`_types.Enum` type allow filtering aliases when using a pep435 Enum. Previous versions of SQLAlchemy kept aliases in all cases, creating database enum type with additional states, meaning that they were treated as different values in the db. For backward compatibility this flag defaults to ``False`` in the 1.4 series, but will be switched to ``True`` in a future version. A deprecation warning is raise if this flag is not specified and the passed enum contains aliases. Fixes: #6146 Change-Id: I547322ffa90d0273d91bb3bf8bfea6ec934d48b9
Diffstat (limited to 'lib/sqlalchemy/sql')
-rw-r--r--lib/sqlalchemy/sql/sqltypes.py30
1 files changed, 29 insertions, 1 deletions
diff --git a/lib/sqlalchemy/sql/sqltypes.py b/lib/sqlalchemy/sql/sqltypes.py
index 367b2e203..59ba7c391 100644
--- a/lib/sqlalchemy/sql/sqltypes.py
+++ b/lib/sqlalchemy/sql/sqltypes.py
@@ -41,6 +41,7 @@ from .. import processors
from .. import util
from ..util import compat
from ..util import langhelpers
+from ..util import OrderedDict
from ..util import pickle
@@ -1425,7 +1426,15 @@ class Enum(Emulated, String, SchemaType):
.. versionadded:: 1.3.8
+ :param omit_aliases: A boolean that when true will remove aliases from
+ pep 435 enums. For backward compatibility it defaults to ``False``.
+ A deprecation warning is raised if the enum has aliases and this
+ flag was not set.
+ .. versionadded:: 1.4.4
+
+ .. deprecated:: 1.4 The default will be changed to ``True`` in
+ SQLAlchemy 2.0.
"""
self._enum_init(enums, kw)
@@ -1450,6 +1459,7 @@ class Enum(Emulated, String, SchemaType):
self.values_callable = kw.pop("values_callable", None)
self._sort_key_function = kw.pop("sort_key_function", NO_ARG)
length_arg = kw.pop("length", NO_ARG)
+ self._omit_aliases = kw.pop("omit_aliases", NO_ARG)
values, objects = self._parse_into_values(enums, kw)
self._setup_for_values(values, objects, kw)
@@ -1506,7 +1516,24 @@ class Enum(Emulated, String, SchemaType):
if len(enums) == 1 and hasattr(enums[0], "__members__"):
self.enum_class = enums[0]
- members = self.enum_class.__members__
+
+ _members = self.enum_class.__members__
+
+ aliases = [n for n, v in _members.items() if v.name != n]
+ if self._omit_aliases is NO_ARG and aliases:
+ util.warn_deprecated_20(
+ "The provided enum %s contains the aliases %s. The "
+ "``omit_aliases`` will default to ``True`` in SQLAlchemy "
+ "2.0. Specify a value to silence this warning."
+ % (self.enum_class.__name__, aliases)
+ )
+ if self._omit_aliases is True:
+ # remove aliases
+ members = OrderedDict(
+ (n, v) for n, v in _members.items() if v.name == n
+ )
+ else:
+ members = _members
if self.values_callable:
values = self.values_callable(self.enum_class)
else:
@@ -1633,6 +1660,7 @@ class Enum(Emulated, String, SchemaType):
kw.setdefault("values_callable", self.values_callable)
kw.setdefault("create_constraint", self.create_constraint)
kw.setdefault("length", self.length)
+ kw.setdefault("omit_aliases", self._omit_aliases)
assert "_enums" in kw
return impltype(**kw)