On 05/10/2017 02:00 PM, Kent Bower wrote:
If never present in __dict__, why does it need to be marked as expired after an insert or update? If not in __dict__ and referenced, isn't won't it load as whether or not it is marked as expired?

if:

1. an attribute is a normal column-oriented attribute

2. the object is "persistent", meaning, it refers to a row in the DB

3. the attribute is not present in __dict__

then:

when you go to access the attribute, the decision made is as follows:

1. if the attribute has a lazy loader associated with it, use that. this is only present if the attribute is "deferred" at the configuration level or via a query option.

2. if the attribute has an expiry callable associated with it, use that. this is only present if the attribute was explicitly marked as expired

3. otherwise, the attribute has no value, return None

The logic you see with "key not in dict" is making sure we hit #2 and not #3 when the object goes from pending to persistent and the column attribute wasn't loaded.

Run test/orm/test_unitofwork.py to see one test fail if you make just the simple change, where we hit #3 instead of #2 for a simple column_property.





On Wed, May 10, 2017 at 1:48 PM, mike bayer <mike...@zzzcomputing.com <mailto:mike...@zzzcomputing.com>> wrote:

    nevermind, the issue is at

    
https://bitbucket.org/zzzeek/sqlalchemy/issues/3984/deferred-column_property-gets-set-to
    
<https://bitbucket.org/zzzeek/sqlalchemy/issues/3984/deferred-column_property-gets-set-to>

    the fix is not as obvious as that, that particular check is assuming
    a column_property() where its value was never present in __dict__ in
    the first place, so it needs to be marked "expired".


    On 05/10/2017 01:38 PM, Kent wrote:

        The regular columns seem to expire and reload properly without
        issue.   (Is that what you're asking?)

        You want me to submit a PR changing:

        if p.expire_on_flush or p.key*not*in state.dict

        to

        if p.expire_on_flush*and*p.key in state.dict*
        *


        ?

        (If so, which branch?)


        On Wednesday, May 10, 2017 at 12:55:45 PM UTC-4, Mike Bayer wrote:

             so you can confirm this is only for custom SQL +
        column_property(), not
             a regular column right?  definitely a bug for 1.2 if you
        can post it up


             On 05/10/2017 12:37 PM, Kent wrote:
              > I'm thinking that should be
              > *"if p.expire_on_flush and p.key in state.dict"*
              >
              >
              > On Wednesday, May 10, 2017 at 11:35:30 AM UTC-4, Kent wrote:
              >
              >     deferred column_properties may be less-efficient
        subquery
             selects
              >     (and thus marked deferred).  When a flush occurs
        that updates an
              >     object, any read-only column_properties are marked as
             expired, even
              >     if they weren't even loaded.  This means if the
        object needs
             to be
              >     refreshed, all these deferred column properties are
        loaded.
              >
              >     We probably want the behavior to only expire read-only
             attributes
              >     that were actually loaded, right?
              >
              >     See attached script.  This behavior is as of 1.1.1
              >
              >     Thoughts?
              >
              >
              > --
              > SQLAlchemy -
              > The Python SQL Toolkit and Object Relational Mapper
              >
              > http://www.sqlalchemy.org/
              >
              > To post example code, please provide an MCVE: Minimal,
        Complete, and
              > Verifiable Example. See
        http://stackoverflow.com/help/mcve
        <http://stackoverflow.com/help/mcve>
             <http://stackoverflow.com/help/mcve
        <http://stackoverflow.com/help/mcve>> for a full
              > description.
              > ---
              > You received this message because you are subscribed to
        the Google
              > Groups "sqlalchemy" group.
              > To unsubscribe from this group and stop receiving emails
        from it,
             send
              > an email to sqlalchemy+...@googlegroups.com
        <mailto:sqlalchemy%2b...@googlegroups.com> <javascript:>
              > <mailto:sqlalchemy+unsubscr...@googlegroups.com
        <mailto:sqlalchemy%2bunsubscr...@googlegroups.com> <javascript:>>.
              > To post to this group, send email to
        sqlal...@googlegroups.com <mailto:sqlal...@googlegroups.com>
             <javascript:>
              > <mailto:sqlal...@googlegroups.com
        <mailto:sqlal...@googlegroups.com> <javascript:>>.
              > Visit this group at
        https://groups.google.com/group/sqlalchemy
        <https://groups.google.com/group/sqlalchemy>
             <https://groups.google.com/group/sqlalchemy
        <https://groups.google.com/group/sqlalchemy>>.
              > For more options, visit
        https://groups.google.com/d/optout
        <https://groups.google.com/d/optout>
             <https://groups.google.com/d/optout
        <https://groups.google.com/d/optout>>.

-- SQLAlchemy -
        The Python SQL Toolkit and Object Relational Mapper

        http://www.sqlalchemy.org/

        To post example code, please provide an MCVE: Minimal, Complete,
        and Verifiable Example. See http://stackoverflow.com/help/mcve
        <http://stackoverflow.com/help/mcve> for a full description.
        ---
        You received this message because you are subscribed to the
        Google Groups "sqlalchemy" group.
        To unsubscribe from this group and stop receiving emails from
        it, send an email to sqlalchemy+unsubscr...@googlegroups.com
        <mailto:sqlalchemy%2bunsubscr...@googlegroups.com>
        <mailto:sqlalchemy+unsubscr...@googlegroups.com
        <mailto:sqlalchemy%2bunsubscr...@googlegroups.com>>.
        To post to this group, send email to sqlalchemy@googlegroups.com
        <mailto:sqlalchemy@googlegroups.com>
        <mailto:sqlalchemy@googlegroups.com
        <mailto:sqlalchemy@googlegroups.com>>.
        Visit this group at https://groups.google.com/group/sqlalchemy
        <https://groups.google.com/group/sqlalchemy>.
        For more options, visit https://groups.google.com/d/optout
        <https://groups.google.com/d/optout>.


-- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper

    http://www.sqlalchemy.org/

    To post example code, please provide an MCVE: Minimal, Complete, and
    Verifiable Example.  See http://stackoverflow.com/help/mcve
    <http://stackoverflow.com/help/mcve> for a full description.
    --- You received this message because you are subscribed to a topic
    in the Google Groups "sqlalchemy" group.
    To unsubscribe from this topic, visit
    https://groups.google.com/d/topic/sqlalchemy/g0QVQ6RbxNU/unsubscribe
    <https://groups.google.com/d/topic/sqlalchemy/g0QVQ6RbxNU/unsubscribe>.
    To unsubscribe from this group and all its topics, send an email to
    sqlalchemy+unsubscr...@googlegroups.com
    <mailto:sqlalchemy%2bunsubscr...@googlegroups.com>.
    To post to this group, send email to sqlalchemy@googlegroups.com
    <mailto:sqlalchemy@googlegroups.com>.
    Visit this group at https://groups.google.com/group/sqlalchemy
    <https://groups.google.com/group/sqlalchemy>.
    For more options, visit https://groups.google.com/d/optout
    <https://groups.google.com/d/optout>.


--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com <mailto:sqlalchemy+unsubscr...@googlegroups.com>. To post to this group, send email to sqlalchemy@googlegroups.com <mailto:sqlalchemy@googlegroups.com>.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

--
SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- You received this message because you are subscribed to the Google Groups "sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to