summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2019-06-12 23:21:03 +0000
committerGerrit Code Review <gerrit@bbpush.zzzcomputing.com>2019-06-12 23:21:03 +0000
commite50da587781d9a1fc48c7505e5f6a661155a3b54 (patch)
tree278cabca24aee3bdf06b1dd66c331643a573be89 /lib
parentb7dd98af83362475f6486d00689b20704f7c8001 (diff)
parent3f7840c2ade87e415c24c69ac5d0494d294750e0 (diff)
downloadsqlalchemy-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.py3
-rw-r--r--lib/sqlalchemy/orm/persistence.py18
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(