1.4.1.1 Example Code

Here is some example code to give you a flavour of the various ways the module operates.

The user connects to a database and obtain a cursor as follows:

import web.database
connection = web.database.connect(adapter='MySQLdb', database='testDatabase')
cursor = connection.cursor()

They interact with the database through a series of methods which form a database abstraction layer. Each method builds an SQL string in accordance with the syntax of the driver and executes it according to the options specified:

results = cursor.select(columns=['name'], tables=['testTable'], where=cursor.where("name = 'James'"), fetch=True)

Results could instead be retrieved as follows if fetch was False:

results = cursor.fetchall(format='dict')

Results are automatically converted to the defined types and returned in the correct format.

web.database cursors also support the execute() statement and qmark style parameter substitutions:

cursor.execute("select name from testTable where name = ?", ['James'])

The SQL is parsed, the parameters converted to SQL and inserted in the correct places and the appropriate abstraction layer method is executed.

The web.database field types are stored in a table in the database so that the web.database driver knows the field types and names of the fields in the tables so that conversions can be made.

The Connection object has an attribute .tables which is a dictionary of Table objects describing everything web.database knows about the tables. Each Table object is made up of Column objects containing field information and converters for each field.

After a SELECT statement the cursor attribute .info contains a list of Column objects for the columns selected to provide all the information available about those columns as well as conversion methods.

If the user needs to access the underlying DB-API driver using its own SQL dialect instead of the portable web.database one he can do so easily in two ways:

cursor.execute("select name from testTable where name = 'James'", mode='direct')
cursor.baseCursor.execute("select name from testTable where name = 'James'")

All the methods and objects have similar functionality to allow the user access to the underlying driver.

The use of an object relational mapper in web.database.object means forms can be automatically generated to provide data access.