创建引用表的一部分的别名

时间:2015-02-22 20:21:19

标签: python web2py

考虑以下数据库结构:

from gluon import DAL, Field

db = DAL('sqlite:memory:') 

db.define_table('party',
    Field('place')
)

db.define_table('participant',
    Field('party_id', 'reference party'),
    Field('name'),
    Field('role')
)    

db.party.insert(place="Jane's home")

db.participant.insert(name='Jane',party_id=1,role='host')
db.participant.insert(name='George',party_id=1,role='organizer')
db.participant.insert(name='John',party_id=1,role='guest')
db.participant.insert(name='Mary',party_id=1,role='guest')

现在。我想做一个选择,我选择每个聚会的主持人和组织者。

我可以这样做:

host = db.participant.with_alias('host')
organizer = db.participant.with_alias('organizer')

rows = db().select(
        db.party.place,
        host.name,
        organizer.name,
    left=(
        host.on((host.party_id==db.party.id) & (host.role=='host')),
        organizer.on((organizer.party_id==db.party.id) & (organizer.role=='organizer'))
    )
)

for row in rows:
    print [row.party.place, row.host.name, row.organizer.name]

但我认为这不是最好的方法。特别是这句话:

& (host.role=='host')

听起来很荒谬。此外,也许下次我必须选择所有主机。然后我必须在任何地方都包括上述条件。

有没有办法定义主机别名,以便我只获得主持人?

我正在寻找一些解决方案:

create view host as select * from participant where role = 'host'

还欢迎任何其他想法让最后一个选择更漂亮!

1 个答案:

答案 0 :(得分:1)

我只是在查看pydoc gluon.DAL,我发现你可以这样做:

db.executesql("CREATE VIEW host AS SELECT * FROM participant WHERE role = 'host'")