diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-11-25 15:09:47 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-11-26 10:42:17 -0500 |
commit | f7fe966a4c40fbe98e6321d275ffee8f898a211b (patch) | |
tree | 294b98de75acc45554ab078f38279742b68ea049 /lib/sqlalchemy/sql/coercions.py | |
parent | c2432d9d190bdc67f274b8da9296ff9ed044bef1 (diff) | |
download | sqlalchemy-f7fe966a4c40fbe98e6321d275ffee8f898a211b.tar.gz |
Remove ORM elements from annotations at the schema level.
Fixed issue where when constructing constraints from ORM-bound columns,
primarily :class:`.ForeignKey` objects but also :class:`.UniqueConstraint`,
:class:`.CheckConstraint` and others, the ORM-level
:class:`.InstrumentedAttribute` is discarded entirely, and all ORM-level
annotations from the columns are removed; this is so that the constraints
are still fully pickleable without the ORM-level entities being pulled in.
These annotations are not necessary to be present at the schema/metadata
level.
Fully implemented coercions for constraint columns within
schema.py, including for FK referenced columns.
Fixes: #5001
Change-Id: I895400dd979310be034085d207f096707c635909
Diffstat (limited to 'lib/sqlalchemy/sql/coercions.py')
-rw-r--r-- | lib/sqlalchemy/sql/coercions.py | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/sqlalchemy/sql/coercions.py b/lib/sqlalchemy/sql/coercions.py index 95aee0468..b45ef3991 100644 --- a/lib/sqlalchemy/sql/coercions.py +++ b/lib/sqlalchemy/sql/coercions.py @@ -147,6 +147,13 @@ class RoleImpl(object): raise exc.ArgumentError(msg, code=code) +class _Deannotate(object): + def _post_coercion(self, resolved, **kw): + from .util import _deep_deannotate + + return _deep_deannotate(resolved) + + class _StringOnly(object): def _resolve_for_clause_element(self, element, argname=None, **kw): return self._literal_coercion(element, **kw) @@ -461,7 +468,9 @@ class TruncatedLabelImpl(_StringOnly, RoleImpl, roles.TruncatedLabelRole): return elements._truncated_label(element) -class DDLExpressionImpl(_CoerceLiterals, RoleImpl, roles.DDLExpressionRole): +class DDLExpressionImpl( + _Deannotate, _CoerceLiterals, RoleImpl, roles.DDLExpressionRole +): _coerce_consts = True @@ -470,11 +479,15 @@ class DDLExpressionImpl(_CoerceLiterals, RoleImpl, roles.DDLExpressionRole): class DDLConstraintColumnImpl( - _ReturnsStringKey, RoleImpl, roles.DDLConstraintColumnRole + _Deannotate, _ReturnsStringKey, RoleImpl, roles.DDLConstraintColumnRole ): pass +class DDLReferredColumnImpl(DDLConstraintColumnImpl): + pass + + class LimitOffsetImpl(RoleImpl, roles.LimitOffsetRole): def _implicit_coercions(self, element, resolved, argname=None, **kw): if resolved is None: |