2016-05-30 2 views
0

私は空にすることができlist_of_ids時には空のpaginateオブジェクトSQLAlchemyの

results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False) 

のpaginate関数を使用して、オブジェクトのリストを取得するために、SQLAlchemyのを使用しています。私は、このリストが空であるクエリは非常に遅いことに気づいた。空リストを照会するのが遅いという警告が表示されます。しかし、私の機能を単純にするために、空のページオブジェクトが必要です。クエリを実行せずにそれを取得する方法はありますか?

答えて

1

あなたは周りの混乱、おそらく可能性があり、クエリを回避するために、空のPaginationオブジェクトの独自のインスタンスをインスタンス化し、単に行を戻さないシンプルな、速い、クエリを実行する方が簡単かもしれません:

>>> empty_paginator = models.Object.query.filter_by(id=None).paginate() 
>>> empty_paginator.items 
[] 
>>> empty_paginator.has_next 
False 

クエリはテーブルのプライマリキーにあるので非常に高速である必要があります。したがって、インデックスを使用します。あなたが存在しないものを選択したことを確認してください。 idはNoneです。そして、このようにそれを使用します。

if list_of_ids: 
    results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False) 
else: 
    results = models.Object.query.filter_by(id=-1).paginate() 

もう一つの方法は、クエリを避けるために、有効なクエリオブジェクトを必要とするメソッドをオーバーライド、Paginationオブジェクトをサブクラス化するために、次のようになります。

class EmptyPaginator(flask.ext.sqlalchemy.Pagination): 
    def __init__(self): 
     super(EmptyPaginator, self).__init__(None, 1, 1, 0, []) 

    def next(self, error_out=False): 
     self.page += 1 
     return self 

    def prev(self, error_out=False): 
     self.page -= 1 
     return self 

は次のようにそれを使用しますこの:

if list_of_ids: 
    results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False) 
else: 
    results = EmptyPaginator() 

またはこの(より簡潔あまり読み):

results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False) if list_of_ids else EmptyPaginator() 
関連する問題