2

このコードは機能しません。SQLAlchemy でこのようなことを行う方法はありますか? 以下には、「Game_Table」という名前のテーブルがあり、「name」という列があります。

list_of_games = session.query(Game_Table).all()
list_of_games.filter(name=="stuff").all()

編集: このコードの目的は、同じクエリを実行し、結果を何度も操作する必要があることです。したがって、コードを最適化するには、最初にクエリを実行して結果を 1 回取得し、同じ結果に対して毎回異なる操作を行います。

4

3 に答える 3

0

の前.allは再利用可能ですが、.all評価がトリガーされ、結果が石に設定されます。私のアドバイスは.all、クエリを再利用する場合は決して保存せず、データが必要な場合にのみ使用することです (これが遅延評価の全体的なポイントであり、本当に必要な場合にのみデータをフェッチします)。

それ以外の:

list_of_games = session.query(Game_Table).all()
list_of_games.filter(name=="stuff").all()

使用する:

list_of_games = session.query(Game_Table)
list_of_games.all()
list_of_games.filter(name=="stuff").all()

[アップデート]

だから、私がやりたいことをする方法がないように聞こえますか?– アップルラバー

私の知る限り、結果ではなく、メソッドチェーンクエリのみを実行できます。そしてそれは理にかなっています: 結果が既にメモリにあるのに、なぜデータベースへのラウンドトリップを支払うのでしょうか? 純粋な Python でのフィルタリング/順序付けは、より安価になります。

# old school lisper style.
sorted(list_of_games, key=lambda x: x.name)
filter(lambda x: x.name=='stuff', list_of_games)
# new style
[x for x in list_of_games if x.name=='stuff']

結果を反復するだけの場合は、ジェネレーター式にします。結果が大きい場合でも、データベースに再度アクセスするよりもコストがかかりません。

for game in (x for x in list_of_games if x.name=='stuff'):
    print_score(game)
于 2013-07-27T02:36:23.003 に答える