# Views and SQLObjects

In general, if your database backend supports defining views you may define them outside of SQLObject and treat them as a regular table when defining your SQLObject class.

## ViewSQLObject

The rest of this document is experimental.

`from sqlobject.views import *`

`ViewSQLObject` is an attempt to allow defining views that allow you to define a SQL query that acts like a SQLObject class. You define columns based on other SQLObject classes .q SQLBuilder columns, have columns that are aggregates of other columns, and join multiple SQLObject classes into one and add restrictions using SQLBuilder expressions.

The resulting classes are currently read only, if you find use for this idea please bring discussion to the mailing list.

A short example from the tests will suffice for now.

Base classes:

    class PhoneNumber(SQLObject):
      number = StringCol()
      calls = SQLMultipleJoin('PhoneCall')
      incoming = SQLMultipleJoin('PhoneCall', joinColumn='toID')

    class PhoneCall(SQLObject):
      phoneNumber = ForeignKey('PhoneNumber')
      to = ForeignKey('PhoneNumber')
      minutes = IntCol()

View classes:

    class ViewPhoneCall(ViewSQLObject):
      class sqlmeta:
          idName = PhoneCall.q.id
          clause = PhoneCall.q.phoneNumberID==PhoneNumber.q.id

      minutes = IntCol(dbName=PhoneCall.q.minutes)
      number = StringCol(dbName=PhoneNumber.q.number)
      phoneNumber = ForeignKey('PhoneNumber', dbName=PhoneNumber.q.id)
      call = ForeignKey('PhoneCall', dbName=PhoneCall.q.id)

    class ViewPhone(ViewSQLObject):
      class sqlmeta:
          idName = PhoneNumber.q.id
          clause = PhoneCall.q.phoneNumberID==PhoneNumber.q.id

      minutes = IntCol(dbName=func.SUM(PhoneCall.q.minutes))
      numberOfCalls = IntCol(dbName=func.COUNT(PhoneCall.q.phoneNumberID))
      number = StringCol(dbName=PhoneNumber.q.number)
      phoneNumber = ForeignKey('PhoneNumber', dbName=PhoneNumber.q.id)
      calls = SQLMultipleJoin('PhoneCall', joinColumn='phoneNumberID')
      vCalls = SQLMultipleJoin('ViewPhoneCall', joinColumn='phoneNumberID')