Thank you. On Friday, August 26, 2016 at 11:59:31 PM UTC+2, Mike Bayer wrote: > > > > On 08/26/2016 05:55 PM, Simon King wrote: > >> On 26 Aug 2016, at 21:42, adaptable (Metaframework) <rogno...@gmail.com > <javascript:>> wrote: > >> > >> Hi all, > >> this comment on Github is well formatted: > >> > >> https://github.com/zzzeek/sqlalchemy/pull/295#issuecomment-242834334 > >> > >> I see the wrong todo.id after the commit (a log string instead 1) > >> > >> [...] > >> 2016-08-26 21:36:56,071 INFO sqlalchemy.engine.base.Engine COMMIT > >> ######### before commit - id: None > >> 2016-08-26 21:36:56,073 INFO sqlalchemy.engine.base.Engine BEGIN > (implicit) > >> 2016-08-26 21:36:56,073 INFO sqlalchemy.engine.base.Engine INSERT INTO > todo (description, done, user_id) VALUES (?, ?, ?) > >> 2016-08-26 21:36:56,073 INFO sqlalchemy.engine.base.Engine ('TODO > test', None, None) > >> 2016-08-26 21:36:56,074 INFO sqlalchemy.engine.base.Engine COMMIT > >> ######### after commit - id: 2016-08-26 21:36:56,075 INFO > sqlalchemy.engine.base.Engine BEGIN (implicit) > >> 2016-08-26 21:36:56,076 INFO sqlalchemy.engine.base.Engine SELECT > todo.id AS todo_id, todo.description AS todo_description, todo.done AS > todo_done, todo.user_id AS todo_user_id > >> FROM todo > >> WHERE todo.id = ? > >> 2016-08-26 21:36:56,076 INFO sqlalchemy.engine.base.Engine (1,) > >> 1 > >> 2016-08-26 21:36:56,077 INFO sqlalchemy.engine.base.Engine SELECT > todo.id AS todo_id, todo.description AS todo_description, todo.done AS > todo_done, todo.user_id AS todo_user_id > >> FROM todo > >> 2016-08-26 21:36:56,077 INFO sqlalchemy.engine.base.Engine () > >> 1 TODO test > >> > >> running this code on MAC (Python 2.7.10) with SQLAlchemy version 1.0.14 > >> > >> > https://github.com/rognoni/adaptable/blob/master/Backend/Python-Flask/storage/sqlalchemy_sqlite.py > > >> > >> [...] > >> ### test > >> session = db_schemas.examples.session() > >> todo = db_schemas.examples.classes.todo(description="TODO test") > >> session.add(todo) > >> print "######### before commit - id: ", todo.id > >> session.commit() > >> print "######### after commit - id: ", todo.id > >> > >> for instance in session.query(db_schemas.examples.classes.todo): > >> print instance.id, instance.description > >> > >> Using the query the instance.id is correct: 1 > > > > I think you are misunderstanding the output. The statement you are > executing is: > > yes! I just saw that too. OK :) thanks for jumping on this. > > > > > > > > >> print "######### after commit - id: ", todo.id > > > > Python is printing out the first part before it even tries to evaluate “ > todo.id”. Then, when it goes to evaluate it, a database query is > triggered (because all the attributes of todo were expired after the > commit). The query output is logged to stdout. Then finally the print > statement prints the value of todo.id, which is the “1” on its own 6 > lines further down. > > > > Here’s a non-SQLAlchemy example demonstrating the same thing: > > > >>>> class A(object): > > ... @property > > ... def attribute(self): > > ... print 'some log output' > > ... return 'actual value' > > ... > >>>> a = A() > >>>> print 'the value is:', a.attribute > > the value is: some log output > > actual value > >>>> print 'using interpolation, the value is %s' % a.attribute > > some log output > > using interpolation, the value is actual value > > > > When you use string interpolation, “a.attribute” has to be evaluated and > substituted into the string before the print statement can run. > > > > If you use the print *function* rather than the print *statement*, all > the arguments will be evaluated before anything is displayed, so this also > wouldn’t happen. > > > > Hope that helps, > > > > Simon > > >
-- 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.