视图和 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')