On Jun 12, 2011, at 5:40 AM, Vinay Sajip wrote:
> The following short script behaves differently if run with no arguments or
> with
> arguments:
> metadata.bind = "sqlite:////tmp/schools.db"
the Engine is associated with the MetaData. The echo flag is off.
> setup_all(create_tables=True)
> school = School(name='Rydell High')
> session.commit()
The Session begins operations on the database, invoking engine.connect() on the
underlying Engine. The Connection object checks the "echo" flag of the Engine
to determine if logging should occur for subsequent calls to execute(). As
you're aware, we try to minimize how often we call upon logging to check for
enabled - the execute() method of Connection is a critical performance point,
so whatever echo was at time of Connection start is what will be used.
> session.commit()
Still in the commit. The transaction is committed the Connection closed, and
all data within the Session is expired.
> r = Subject._descriptor.find_relationship('teachers')
> t = r.table
> if len(sys.argv) > 1:
> c = Subject.school == school
> else:
> c = Subject.school_id == school.id
> s = select([Teacher.name],
> and_(c, t.c.prof_id == Teacher.id, t.c.course_id == Subject.id))
An expression is created, comparing "Subject.school_id" to a value. In the
case of passing the School object, the value is a bind which will invoke a
callable upon the School at statement compilation time to retrieve the value of
".id", which remember has been expired due to the commit(). In the case of
passing school.id, the Session is told to retrieve the expired value
immediately, so the Session wakes up, gets a Connection, checks the bind flag
again, retrieves the formerly expired "school" row.
> metadata.bind.echo = True
the echo flag is turned on which only affects subsequent Connection objects.
In one case, the Session hasn't done anything yet, in the other, it's started
up a transaction with a new Connection already.
> print('Executing query using SQLAlchemy', __version__)
> session.execute(s)
In the first case, the lazy callable inside the comparison expression loads the
"school.id" value, which wakes up the Session with a new Connection, using the
new echo flag. In the second case, this does not happen.
Also see the note at the bottom of
http://www.sqlalchemy.org/docs/core/engines.html?highlight=echo#configuring-logging
.
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.