you can check for new/dirty/deleted in after_flush, these collections haven't yet been reset. after_flush_postexec is where they are reset.


On 6/22/15 7:45 PM, imali...@uber.com wrote:
Why wouldn't you check for new, dirty deleted 'before_flush' instead of 'after_flush'. Would 'after_flush' even work?

On Thursday, October 9, 2014 at 1:34:58 PM UTC-4, Tom Dalton wrote:

    Brilliant, the after_flush event sounds like the way to go. I
    guess my event handlers would be:

    after_begin:
      session.info.clean = True
    after_flush:
      if new, dirty, deleted:
        session.info.clean = False
    after_commit:
      session.info.clean = True
    after_rollback:
      session.info.clean = True

    Then in my context manager I just need to check both (current
    session.new .dirty .deleted) and (my new session.info.clean
    attribute) to determine if the session has been left with
    uncommitted changes. Does that sound like what you'd expect? Are
    there any other events you can think of that I'd need to handle/be
    careful of?

    Thanks a lot for your help!

    Tom

    On 9 October 2014 17:42, Michael Bayer <mik...@zzzcomputing.com
    <javascript:>> wrote:


        On Oct 9, 2014, at 12:16 PM, Tom Dalton <tom.d...@fanduel.com
        <javascript:>> wrote:


        Thanks for the reply. I saw the session transaction events
        stuff but I'm not sure that they help me (correct me if I'm
        wrong). I believe a transaction will exist if I run *any*
        query, not just one that modifies data. Also, the docs imply
        that a session will effectively always have a transaction
        when using autoflush mode. Finally, the after_begin event
        only fires once. So I'd have no way to tell the difference
        between the session state after the following 3 scenarios:

        1. (implicit) begin, select, update, select, (autoflush)
        2. (implicit) begin, select, (autoflush)
        3. (implicit) begin, select

        In my use case, I want to detect the uncommitted (but
        flushed) changes and throw an error, but cases 2 and 3 are 'ok’.

        OK, so catch after_begin, as well as after_flush - inside of
        after_flush, check a boolean for .new, .dirty, .deleted, that
        will tell you if the flush actually rendered any changes
        (which usually it has, you can just record after_flush()
        happening at all as “changes were probably emitted”).



        Even disabling autoflush doesn't help, since I'd still be
        unable to tell if the (erroneous/buggy) code had done an
        explicit flush without a subsequent rollback or commit.

        I'm feeling a bit stuck, but I assume this information must
        exist in SQLAlchemy somewhere, since if you do:

        4. (implicit) begin, select X, update X, flush, rollback

        then SQLAlchemy must 'know' which instance's (flushed)
        changes have been rolled back in order to change those
        instances' state (I think in the above example, it would mark
        X as detached?). The problem is I don't know where or how
        it's maintaining that info…

        it maintains that in session.transaction._new,
        session.transaction._dirty, session.transaction._deleted, but
        these are weak referencing (because if references to the
        object are lost on the outside, we forget about it) so aren’t
        guaranteed to show you that something definitely didn’t
        happen.  (hence events the best way to go)


-- 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
        <javascript:>.
        To post to this group, send email to sqlal...@googlegroups.com
        <javascript:>.
        Visit this group at http://groups.google.com/group/sqlalchemy
        <http://groups.google.com/group/sqlalchemy>.
        For more options, visit https://groups.google.com/d/optout
        <https://groups.google.com/d/optout>.


--
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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

--
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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to