首先,对不起,如果事实证明我正在尝试做的就是在这里冒烟,我绝不是DB或SQLA专家。 =)
我有两个类,Person和Organization,它们使用表继承从Contact继承。 (Person.id是Contact.id的一个fkey),工作正常。
我想从搜索框中搜索并获取所有联系人的列表。通常情况下,当我处理一系列事情后,我会这样做:
def build_query(self):
return self.session.query(Person)
def filter_query(self, query)
if self.search_form_values.get('name_last',None):
query = query.filter(
Person.name_last==self.search_form_values.get('name_last')
)
...
return query
然后在其他地方执行查询。问题是我想找回一个Contact对象列表, 但是我希望过滤Organization.name,Person.name_last和Person.name_first,所有这些都来自输入的值 进入搜索表单上的“名称”框。我无法弄清楚如何使用一个查询来执行此操作,不确定它是否可行。 我确定要避免使用交错结果进行两次单独的查询。
是否有一些过滤功夫可以让我做上述事情?即
由于
伊恩
答案 0 :(得分:1)
每个主题:
http://groups.google.com/group/sqlalchemy/browse_thread/thread/b45ccc630739ae78#
如果查询(联系人).with_polymorphic([Person,Organization]),您可以参考Person。和组织。在您的查询中。它将从联系到每个相关表格产生LEFT OUTER JOIN。
答案 1 :(得分:0)
我认为在SQL中根本不容易实现。单个SQL查询只能返回固定数量的列,并且每行必须具有所有相同的列。你的人和组织明显不同。
当然,总是可以返回两个表的列的并集,将特定记录中不存在的列设置为null
。我不认为SQLAlchmey对象很容易从这些数据中重新创建。我不是说这是不可能的,但我打赌10美元是不切实际的。
如果我是你,我宁愿使用两个查询,合并结果,看看性能是否足够糟糕,无论如何。
当然,获取和合并两个查询会使分页输出变得很麻烦。如果我非常关心搜索响应性,我可能会考虑获取过多的记录并将它们缓存在RAM或临时表中,并链接到特定的搜索请求(例如其哈希)。很少需要超过2-3页的用户必须等待繁重的查询才能运行,但大多数用户都会得到快速的服务。