diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2019-06-12 23:21:03 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@bbpush.zzzcomputing.com> | 2019-06-12 23:21:03 +0000 |
| commit | e50da587781d9a1fc48c7505e5f6a661155a3b54 (patch) | |
| tree | 278cabca24aee3bdf06b1dd66c331643a573be89 /lib | |
| parent | b7dd98af83362475f6486d00689b20704f7c8001 (diff) | |
| parent | 3f7840c2ade87e415c24c69ac5d0494d294750e0 (diff) | |
| download | sqlalchemy-e50da587781d9a1fc48c7505e5f6a661155a3b54.tar.gz | |
Merge "Run PK/FK sync for multi-level inheritance w/ no intermediary update"
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sqlalchemy/orm/dependency.py | 3 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/persistence.py | 18 |
2 files changed, 20 insertions, 1 deletions
diff --git a/lib/sqlalchemy/orm/dependency.py b/lib/sqlalchemy/orm/dependency.py index 8a77d5052..f0ba6051d 100644 --- a/lib/sqlalchemy/orm/dependency.py +++ b/lib/sqlalchemy/orm/dependency.py @@ -622,7 +622,8 @@ class OneToManyDP(DependencyProcessor): class ManyToOneDP(DependencyProcessor): def __init__(self, prop): DependencyProcessor.__init__(self, prop) - self.mapper._dependency_processors.append(DetectKeySwitch(prop)) + for mapper in self.mapper.self_and_descendants: + mapper._dependency_processors.append(DetectKeySwitch(prop)) def per_property_dependencies( self, diff --git a/lib/sqlalchemy/orm/persistence.py b/lib/sqlalchemy/orm/persistence.py index 5106bff94..072d34f8c 100644 --- a/lib/sqlalchemy/orm/persistence.py +++ b/lib/sqlalchemy/orm/persistence.py @@ -680,6 +680,7 @@ def _collect_update_commands( continue has_all_pks = True + expect_pk_cascaded = False if bulk: # keys here are mapped attribute keys, so # look at mapper attribute keys for pk @@ -704,6 +705,7 @@ def _collect_update_commands( or ("pk_cascaded", state, col) in uowtransaction.attributes ): + expect_pk_cascaded = True pk_params[col._label] = history.added[0] params.pop(col.key, None) else: @@ -731,6 +733,22 @@ def _collect_update_commands( has_all_defaults, has_all_pks, ) + elif expect_pk_cascaded: + # no UPDATE occurs on this table, but we expect that CASCADE rules + # have changed the primary key of the row; propagate this event to + # other columns that expect to have been modified. this normally + # occurs after the UPDATE is emitted however we invoke it here + # explicitly in the absense of our invoking an UPDATE + for m, equated_pairs in mapper._table_to_equated[table]: + sync.populate( + state, + m, + state, + m, + equated_pairs, + uowtransaction, + mapper.passive_updates, + ) def _collect_post_update_commands( |
