提供したコードには2つの問題があり、得られる結果が得られる理由を説明しています。
最初の問題は、クエリがtest.query.filter(url ='.').all()
であるということです。 空のリストを返します。これにより、指定したフィルターで使用する有効なインデックスがないという理由だけで、空のリストが返されます。その列には2つのインデックスがあります-一意のインデックス(正確な文字列でURLを検索するのに便利です)とサフィックスインデックス(特定の文字列で終わるURLを見つけるのに便利です)-どちらも、何になるかでフィルタリングする機能を提供しませんリレーショナルの世界では、「like」クエリ。プレフィックスインデックス(prefix=True
で作成) )test.query.like(url='*.')
を使用できます 、ただし、それは非常に遅くなります(直接ルックアップの代わりにインデックススキャンを実行します[1])。
このようなインデックス/クエリ関連の問題を防ぐために、ユーザーが存在しないインデックスでデータをフィルタリングしようとしたときに、QueryError例外を追加しました。これらの変更を加えて、今夜少し遅れて0.31.4をリリースする予定です。
例外の原因である2番目のエラーは、.count()
を呼び出すことです。 引数なし。 h.count()
の時点で 呼び出し、type(h) == list
、およびPythonリストオブジェクトには、リストで指定された引数と等しい値をカウントするための引数が必要です。 .all()
をスキップした場合 元のクエリの一部である場合、クエリオブジェクトが返されます。そのクエリオブジェクトには.count()
があります メソッドであり、一致した結果のカウントを返します。
[1] romのすべての「like」クエリが遅いわけではありませんが、速いクエリでは、スキャン/フィルタリングするデータ範囲を制限するためにワイルドカード以外のプレフィックスが必要です。