0

首先,很抱歉,如果事实证明我要做的是在这里冒烟,我绝不是 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,所有这些都来自在搜索表单上的“名称”框中键入的值。我不知道如何用一个查询来做到这一点,甚至不确定它是否可能。不过,我肯定想避免两个单独的查询具有交错的结果。

是否有一些过滤功夫可以让我做到以上几点?IE

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

谢谢

伊恩

4

2 回答 2

1

每个线程:

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

如果查询(Contact).with_polymorphic([Person, Organization]),可以参考Person。和组织。在您的查询中。它将产生一个从联系人到每个相关表的 LEFT OUTER JOIN。

于 2012-10-04T14:44:45.790 回答
0

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

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

如果我是你,我宁愿使用两个查询,合并结果,看看性能是否足够糟糕以至于无法关心。

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

于 2012-09-28T03:51:26.500 回答