视图和 SQLObject

一般来说,如果你的数据库后端支持定义视图,你可以在 SQLObject 外部定义它们,并在定义 SQLObject 类时将它们视为常规表。

ViewSQLObject

本文档的其余部分是实验性的。

from sqlobject.views import *

ViewSQLObject 尝试允许定义视图,让你可以定义一个 SQL 查询,该查询的行为类似于 SQLObject 类。你可以根据其他 SQLObject 类 .q SQLBuilder 列定义列,拥有作为其他列的聚合的列,将多个 SQLObject 类连接到一个类中,并使用 SQLBuilder 表达式添加限制。

生成类目前是只读的,如果你发现这个想法有用,请在邮件列表中进行讨论。

现在,测试中的一个简短示例就足够了。

基本类

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

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

视图类

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')
Get SQLObject at SourceForge.net. Fast, secure and Free Open Source software downloads