考虑以下数据库结构:
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'
还欢迎任何其他想法让最后一个选择更漂亮!
答案 0 :(得分:1)
我只是在查看pydoc gluon.DAL
,我发现你可以这样做:
db.executesql("CREATE VIEW host AS SELECT * FROM participant WHERE role = 'host'")