0

まず最初に、私がやろうとしていることがスモーク クラックであることが判明した場合は申し訳ありません。私は決して DB や SQLA の専門家ではありません。=)

テーブル継承を使用して Contact から継承する Person と Organization の 2 つのクラスがあります。( 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 でフィルタリングしたいことです。1 つのクエリでこれを行う方法がわかりません。それが可能かどうかもわかりません。ただし、結果がインターリーブされた 2 つの個別のクエリを使用することは避けたいと思います。

上記を可能にするフィルタリングカンフーはありますか?すなわち

  • 次のすべての連絡先を取得します。
    • 連絡先が個人の場合、name_last または name_first が一致する
    • 連絡先が組織の場合、名前が一致している

ありがとう

イアン

4

2 に答える 2

1

スレッドごとに:

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

query(Contact).with_polymorphic([Person, Organization]) で Person を参照できます。そして組織。あなたのクエリで。contact から関連する各テーブルへの LEFT OUTER JOIN が生成されます。

于 2012-10-04T14:44:45.790 に答える
0

SQLで簡単に達成できるとは思いません。1 つの SQL クエリで返すことができる列の数は決まっており、すべての行にはすべて同じ列が含まれている必要があります。あなたの個人と組織は明らかに異なります。

もちろん、特定のレコードに存在しない列を に設定して、2 つのテーブルの列の結合をいつでも返すことができますnull。そのようなデータから SQLAlchmey オブジェクトを簡単に再作成できるとは思いません。不可能だと言っているわけではありませんが、10 ドルを賭けても非現実的です。

私があなたなら、2 つのクエリを使用し、結果をマージして、気にするほどパフォーマンスが悪いかどうかを確認します。

もちろん、2 つのクエリをフェッチしてマージすると、ページ分割された出力が面倒になります。検索の応答性を重視する場合は、過剰なレコードをフェッチして、RAM または一時テーブルにキャッシュし、特定の検索要求 (そのハッシュなど) にリンクすることを検討するかもしれません。2 ~ 3 ページ以上を必要とするユーザーは、負荷の高いクエリの実行を待たなければならないことはほとんどありませんが、ほとんどのユーザーには迅速にサービスが提供されます。

于 2012-09-28T03:51:26.500 に答える