On Thu, Nov 16, 2017 at 7:45 AM,  <[email protected]> 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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to