| > SomeTable.select(SomeTable.q.Foo > 30)
| >
| > Why doesn't the inner parameter, SomeTable.q.Foo > 30, get evaluated to some boolean value?

.q is an object that returns special attributes of type
sqlbuilder.SQLExpression. SQLExpression is a special class that overrides
almost all Python magic methods and upon any operation instead of
evaluating it constructs another instance of SQLExpression that remembers
what operation it has to do. A kind of symbolic algebra. Example:

   SQLExpression("foo") > 30

produces SQLExpression("foo", ">", 30) (well, it really produces
SQLExpression(SQLExpression("foo")...))

| > How does the select(...) method know what to do?

In short, .select() recusively evaluates the top-most SQLExpression to a
string:

   SQLExpression("foo", ">", 30) => "foo > 30"

and passes the result as a string to the SQL backend.

The longer but more detailed and correct explanation is that .select()
produces an instance of SelectResults class that upon being iterated over
produces an instance of Iteration class that upon calling its .next()
method (it is iterator!) construct the SQL query string, passes it to the
backend, fetches the results and passes them back to the user.

For the details of the implementation see sqlobject/main.py for SQLObject,
sqlbuilder.py for SQLExpression, sqlobject/dbconnection.py for DBConnection
class (that constructs the query strings) and Iteration class, and
different subdirectories of sqlobject for concrete implementations of
connection classes - different backends require different query strings.

.. image:: http://sourceforge.net/sflogo.php?group_id=74338&type=4
   :height: 37
   :width: 125
   :alt: Hosted by SourceForge
   :target: http://sourceforge.net/
