]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Add missing disambiguation to non-primary mapper example
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 28 Dec 2018 14:33:07 +0000 (09:33 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 28 Dec 2018 14:36:37 +0000 (09:36 -0500)
The mapping to B over a join defines an alternate primary key
based on all the primary key columns in the join unless we
re-define it explicitly.   Similarly, people expect that
``.id`` looks the same.  make sure these line up with the
old mapping.

Change-Id: I1ab064c57019e79c34293f6588d1e033f7083974
(cherry picked from commit 16f08cbed5ff4f0f0b08dbd0dbd6e49aaee79163)

doc/build/orm/join_conditions.rst

index 8b9d56b336a0cc26abb6978a9df91f9db7c6567b..9044f2acaf09803ac0d29de1ac8cdd66de465008 100644 (file)
@@ -699,10 +699,18 @@ the rows in both ``A`` and ``B`` simultaneously::
     # 2. Create a new mapper() to B, with non_primary=True.
     # Columns in the join with the same name must be
     # disambiguated within the mapping, using named properties.
-    B_viacd = mapper(B, j, non_primary=True, properties={
-        "b_id": [j.c.b_id, j.c.d_b_id],
-        "d_id": j.c.d_id
-        })
+    # we also have to make sure the primary key of the regular "B"
+    # mapping is maintained.
+    B_viacd = mapper(
+        B, j, non_primary=True, primary_key=[j.c.b_id],
+        properties={
+            "id": j.c.b_id,  # so that 'id' looks the same as before
+            "c_id": j.c.c_id,   # needed for disambiguation
+            "d_c_id": j.c.d_c_id,  # needed for disambiguation
+            "b_id": [j.c.b_id, j.c.d_b_id],
+            "d_id": j.c.d_id,
+        }
+    )
 
     A.b = relationship(B_viacd, primaryjoin=A.b_id == B_viacd.c.b_id)