Can you explain why you actually want to do this? There might be
better options than before_flush, but we'd need to know exactly what
you're trying to do first.

Simon

On Thu, Nov 16, 2017 at 12:55 PM,  <jens.troe...@gmail.com> wrote:
> That makes sense, thank you, Simon!
>
> Regarding the events: you suggest to use a before_flush() to examine
> session.dirty whenever a session.query() executes?
>
> Also, is there a way to get the list of objects that have been flushed, or
> should I track them myself whenever a before_flush() event occurs?
>
> Jens
>
>
> On Thursday, November 16, 2017 at 7:49:54 PM UTC+10, Simon King wrote:
>>
>> On Thu, Nov 16, 2017 at 7:45 AM,  <jens.t...@gmail.com> wrote:
>> > Hello,
>> >
>> > I've been exploring some of the session functionality that handles
>> > object
>> > states, and I'm quite confused. Here is what I see:
>> >
>> >>>> engine = engine_from_config({'sqlalchemy.url': 'mysql+pymysql://…'})
>> >>>> session_factory = sessionmaker(bind=engine) # No autoflush
>> >>>> session = session_factory()
>> >>>> # Now query a table to get an object.
>> >>>> p = session.query(Table).filter(Table.id == '0f4…ed6').one_or_none()
>> >>>> p.name
>> > "Some Name"
>> >>>> p.name = "Other Name"
>> >>>> session.dirty
>> > IdentitySet([<Table object at 0x10bb50d68>])
>> >>>> session.is_modified(p)
>> > True
>> >>>> session._is_clean()
>> > False
>> >
>> > This all makes sense. If I now create a new query, then the above change
>> > seems to be gone, but isn't?
>> >
>> >>>> p2 = session.query(Table).filter(Table.id ==
>> >>>> '384…a05c').one_or_none()
>> >>>> session.dirty
>> > IdentitySet([])
>> >>>> session.is_modified(p)
>> > False # p is not modified according to this.
>> >>>> session._is_clean()
>> > True
>> >>>> p.name
>> > "Other Name" # p still has the modified name.
>> >
>> > The new query seems to set the session to "clean", but the object p
>> > still
>> > contains its change. I can't quite find documentation for the behavior.
>> > What
>> > am I missing?
>> >
>> > What I would like to do is: in one session, select a few objects
>> > (multiple
>> > queries), inspect, perhaps modify them. Then I'd like to query if there
>> > were
>> > any modifications/deletes and if so choose to commit or rollback.
>> > Initially
>> > I thought to use the Session.dirty/deleted/new properties, but then the
>> > above showed.
>> >
>> > If I was to set autoflush, how could I inspect the flushed code buffer?
>> >
>> > Thanks!
>> > Jens
>>
>> The results you are seeing are due to autoflush, which is on by
>> default. When you run your second query, the session flushes any
>> pending changes to the database before running the query. After the
>> flush, the session is considered clean. The methods you were using
>> (dirty, is_modified etc.) indicate whether the session contains
>> changes that haven't been flushed to the database. They don't tell you
>> if the database has received changes that haven't yet been committed.
>>
>> There are various ways to do what you want, depending on how your code
>> is structured. One possibility is to use a Session event such as
>> before_flush to set a flag saying that there are uncomitted changes in
>> the database.
>>
>> http://docs.sqlalchemy.org/en/latest/orm/session_events.html
>>
>> Hope that helps,
>>
>> Simon
>
> --
> 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.

-- 
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