SQLAlchemy,通过表继承过滤联接查询



首先,很抱歉,如果我想做的是在这里吸烟破解,我决不是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

然后在其他地方执行查询。问题是我想取回联系人对象的列表,但我想根据键入的值筛选Organization.name、Person.name_last和Person.name_first进入搜索表单上的"名称"框。我不知道如何用一个查询来实现这一点,也不确定这是否可能。不过,我确实希望避免出现两个结果交错的单独查询。

有没有一些过滤功夫可以让我做到以上这些?即

  • 取回所有联系人:
    • 如果联系人是个人,则具有name_last或name_first匹配项
    • 如果联系人是组织,则名称匹配

感谢

Iain

每个线程位于:

http://groups.google.com/group/sqlalchemy/browse_thread/thread/b45ccc630739ae78#

如果你查询(联系人).with_polymmorphic([个人,组织]),你可以参考个人。和组织。在您的查询中。它将生成从联系人到每个相关表的LEFTOUTERJOIN。

我认为这在SQL中根本不容易实现。单个SQL查询只能返回固定数量的列,并且每一行都必须具有相同的列。您的个人和组织显然不同。

当然,总是可以返回两个表的列的并集,将特定记录中不存在的列设置为null。我认为从这样的数据中重新创建SQLAlchmey对象并不容易。我并不是说这是不可能的,但我敢打赌10美元,这是不切实际的。

如果我是你,我宁愿使用两个查询,合并结果,看看性能是否糟糕到可以关心的程度。

当然,获取和合并两个查询会使分页输出变得困难。如果我非常关心搜索响应性,我可能会考虑提取过多的记录,并将它们缓存在RAM或临时表中,链接到特定的搜索请求(例如其哈希)。需要超过2-3个页面的用户很少需要等待大量查询的运行,但大多数用户会很快得到服务。

最新更新