]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Add notes regarding flat=True
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 7 Mar 2018 21:03:07 +0000 (16:03 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 7 Mar 2018 21:03:58 +0000 (16:03 -0500)
Start documenting that flat=True and aliased=True don't work
with selectable particularly when selectable is an aliased select
already.  References #4212

Change-Id: I6e576165f06387350ae97e43ad979e575a4912b9
(cherry picked from commit 39d7dfa08accf6cce6d53b0807603bf43d580791)

doc/build/orm/inheritance_loading.rst
lib/sqlalchemy/orm/util.py

index 85e6af8bdd3b6175cf9265277fa58fba383d83b5..c479cf35327c174b1107febd8e8127acef0f9e7c 100644 (file)
@@ -222,6 +222,12 @@ right-nested JOIN in our statement.   Some older databases, in particular older
 versions of SQLite, may have a problem with this syntax, although virtually all
 modern database versions now support this syntax.
 
+.. note::
+
+    The :paramref:`.orm.with_polymorphic.flat` flag only applies to the use
+    of :paramref:`.with_polymorphic` with **joined table inheritance** and when
+    the :paramref:`.with_polymorphic.selectable` argument is **not** used.
+
 Referring to Specific Subclass Attributes
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -442,11 +448,22 @@ can be loaded::
             )
         )
 
-When using :func:`.with_polymorphic` in conjunction with
-:func:`.joinedload`, the :func:`.with_polymorphic` object must include
-the ``aliased=True`` or ``flat=True`` flag, so that the polymorphic
-selectable is aliased (an informative error message is raised otherwise).
-"flat" is an alternate form of aliasing that produces fewer subqueries.
+.. note::
+
+    When using :func:`.with_polymorphic` in conjunction with
+    :func:`.joinedload`, the :func:`.with_polymorphic` object must be against
+    an "aliased" object, that is an instance of :class:`.Alias`, so that the
+    polymorphic selectable is aliased (an informative error message is raised
+    otherwise).
+
+    The typical way to do this is to include the
+    :paramref:`.with_polymorphic.aliased` or :paramref:`.flat` flag, which will
+    apply this aliasing automatically.  However, if the
+    :paramref:`.with_polymorphic.selectable` argument is being used to pass an
+    object that is already an :class:`.Alias` object then this flag should
+    **not** be set.  The "flat" option implies the "aliased" option and is an
+    alternate form of aliasing against join objects that produces fewer
+    subqueries.
 
 Once :meth:`~.PropComparator.of_type` is the target of the eager load,
 that's the entity we would use for subsequent chaining, not the original class
index ed7946f3dd737fde3e01992998f56a5de8702446..9816600d8b247d7a7c6f1516260a02f35112fbc0 100644 (file)
@@ -698,7 +698,10 @@ def with_polymorphic(base, classes, selectable=False,
         This can be important when using the with_polymorphic()
         to create the target of a JOIN on a backend that does not
         support parenthesized joins, such as SQLite and older
-        versions of MySQL.
+        versions of MySQL.   However if the
+        :paramref:`.with_polymorphic.selectable` parameter is in use
+        with an existing :class:`.Alias` construct, then you should not
+        set this flag.
 
     :param flat: Boolean, will be passed through to the
      :meth:`.FromClause.alias` call so that aliases of :class:`.Join`