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.st...@gmail.com wrote: > 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. > -- 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.