SQLBuilder

A number of variables from SQLBuilder are included with from SQLObject import * -- see the relevant SQLObject documentation for more. Its functionality is also available through the special q attribute of SQLObject classes.

Using SQLBuilder

SQLBuilder uses clever overriding of operators to make Python expressions build SQL expressions -- so long as you start with a Magic Object that knows how to fake it.

With SQLObject, you get a Magic Object by access the q attribute of a table class -- this gives you an object that represents the field. Maybe explanations aren't as good. Here's some examples:

>>> from SQLBuilder import *
>>> person = table.person
# person is now equivalent to the Person.q object from the SQLObject
# documentation
>>> person
person
>>> person.first_name
person.first_name
>>> person.first_name == 'John'
person.first_name = 'John'
>>> name = 'John'
>>> person.first_name != name
person.first_name <> 'John'
>>> AND(person.first_name == 'John', person.last_name == 'Doe')
(person.first_name = 'John AND person.last_name = 'Doe')

Most of the operators work properly: <, >, <=, >=, !=, ==, +, -, /, *, **, %. However, and, or, and not do not work. You can use &, |, and ~ instead -- but be aware that these have the same precedence as multiplication. So:

# This isn't what you want:
>> person.first_name == 'John' & person.last_name == 'Doe'
(person.first_name = ('John' AND person.last_name)) = 'Doe'
# This is:
>> (person.first_name == 'John') & (person.last_name == 'Doe')
((person.first_name = 'John') AND (person.last_name == 'Doe'))

SQLBuilder also contains the functions AND, OR, and NOT which also work -- I find these easier to work with. AND and OR can take any number of arguments.

You can also use .startswith() and .endswith() on a SQL expression -- these will translate to appropriate LIKE statements (but all % quoting is handled for you, so you can ignore that implementation detail). There is also a LIKE function, where you can pass your string, with % for the wildcard, as usual.

If you want to access a SQL function, use the func variable, like:

>> person.created < func.NOW()

That's it -- enjoy!