I only learned about it through the O'Reilly book. The mention there may be the reason for it's popularity. I didn't notice an reference to the session flush there. Might be good to recommend a note be added to that section for newbies like me.
-Jim On Saturday, February 9, 2019 at 10:10:16 AM UTC-6, Mike Bayer wrote: > > As the history feature has become more known I think I've seen people have > this confusion before so the docs for history should be changed to note > this with a dragon. > > On Sat, Feb 9, 2019, 11:04 AM Jim Steil <ato....@gmail.com <javascript:> > wrote: > >> Mike - Thanks for such a great explanation. It is truly appreciated. >> >> -Jim >> >> On Fri, Feb 8, 2019 at 4:53 PM Mike Bayer <mik...@zzzcomputing.com >> <javascript:>> 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....@gmail.com <javascript:>> >>> 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+...@googlegroups.com <javascript:>. >>> > To post to this group, send email to sqlal...@googlegroups.com >>> <javascript:>. >>> > 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+...@googlegroups.com <javascript:>. >>> To post to this group, send email to sqlal...@googlegroups.com >>> <javascript:>. >>> 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+...@googlegroups.com <javascript:>. >> To post to this group, send email to sqlal...@googlegroups.com >> <javascript:>. >> 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.