Mike - Thanks for such a great explanation.  It is truly appreciated.

-Jim

On Fri, Feb 8, 2019 at 4:53 PM Mike Bayer <mike...@zzzcomputing.com> wrote:

> changes to attributes are only significant until the next flush
> occurs.   flushing is described at :
> https://docs.sqlalchemy.org/en/latest/orm/session_basics.html#flushing.
>   When flush() happens, the changes to your attributes are pushed out
> to the database, and the history is erased.   This is because the
> system only supports a "current" a "previous" value, it is only
> designed to suit the purposes of session.flush(), which is to show how
> the attribute differs from what is known to be in the database (in
> this sense it's really not "history", it's just, "whats in the DB
> right now?").
>
> An important aspect to flushing is that the Session automatically
> flushes before each query.   This is called autoflush.   if you want
> to look at things that are affected by the flush occurring, you need
> to turn it off.   the docs above illustrate you can set
> session.autoflush = False, but there is also a context manager that
> may be more useful; the above documentation will include the link to
> this manager in the next ten minutes, however it looks like:
>
> with session.no_autoflush:
>    myobject.foo = bar
>    session.query(MyObject).all()
>   inspect(myobject).attrs.foo.history
>
> direct docs for no_autoflush:
>
> https://docs.sqlalchemy.org/en/latest/orm/session_api.html?highlight=no_autoflush#sqlalchemy.orm.session.Session.no_autoflush
>
>
>
>
>
> On Fri, Feb 8, 2019 at 3:22 PM Jim S <ato.st...@gmail.com> wrote:
> >
> > Hi
> >
> > Newbie here.  I think I have a fundamental misunderstanding of either
> how session works or you inspect works.  My goal is to track changes to my
> object.  I wrote up this sample to show what I'm having trouble
> understanding.
> >
> > from sqlalchemy import create_engine, inspect
> > from sqlalchemy import Column, BigInteger, String, Date, Integer
> > from sqlalchemy.ext.declarative import declarative_base
> > from sqlalchemy.orm import sessionmaker
> >
> > from dateutil.relativedelta import *
> >
> > Base = declarative_base()
> >
> >
> > class SaTest(Base):
> >     __tablename__ = 'sa_test'
> >
> >     id = Column(BigInteger, primary_key=True)
> >     name = Column(String(50))
> >     dob = Column(Date)
> >     number_of_children = Column(Integer)
> >
> >     def __repr__(self):
> >         return self.name
> >
> >
> > engine = create_engine('mysql://mysqluser:mysqlpassword@servername
> /databasename')
> > Base.metadata.bind = engine
> >
> > DBSession = sessionmaker(bind=engine)
> > session = DBSession()
> >
> > """
> > #  run this the first time to create the data
> > jim = SaTest(name='Jim', dob=parse('1971-02-23'), number_of_children=3)
> > session.add(jim)
> >
> > joe = SaTest(name='Joe', dob=parse('1968-06-09'), number_of_children=5)
> > session.add(joe)
> >
> > session.commit()
> > """
> >
> > jim = session.query(SaTest).filter_by(id=1).one()
> > jim.dob = jim.dob + relativedelta(days=+14)
> > jim.number_of_children = jim.number_of_children + 1
> >
> > #joe = session.query(SaTest).filter_by(id=2).first()   <----  if I
> uncomment this line, inspect doesn't display the changes in history
> >
> > insp = inspect(jim)
> >
> > for attr, attr_state in insp.attrs.items():
> >     if attr_state.history.has_changes():
> >         print('{}: {}'.format(attr, attr_state.value))
> >         print('History: {}\n'.format(attr_state.history))
> >
> >
> > I've built this based on the example at the bottom of page 107 in the
> O'Reilly Essential SQLAlchemy book.
> >
> > It seems to my that running the second query is somehow invalidating the
> inspection of the jim object.  I'd really like to understand why, but
> haven't been able to find anything to help explain it to me.
> >
> > Any help would really be appreciated.
> >
> > -Jim
> >
> > --
> > 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 a topic in the
> Google Groups "sqlalchemy" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/sqlalchemy/P7iQBRipcXg/unsubscribe.
> To unsubscribe from this group and all its topics, 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