2011-11-24 17 views
34

さまざまな理由で、データベースからオブジェクトのコレクションを取得し、データベースに接続されていない別のプロセスに渡そうとしています。私のコードは、以下のいずれかのように見えますが、私はget_list()方法の外に私のリストの要素を見しようとするとSQLAlchemy、セッションにバインドされていないオブジェクトを取得する

sqlalchemy.exc.UnboundExecutionError: Instance <MyClass at 0x8db7fec> is not bound to a Session; attribute refresh operation cannot proceed 

を得続けます。

def get_list (obj): 
    sesson = Session() 
    lst = session.query(MyClass).all() 
    session.close() 
    return lst 

私はこの

def get_list_bis (obj) 
    session = Session() 
    return session.query(MyClass).all() 

を使用している場合しかし、私はそれが閉じられなかったための要素を使用しますが、セッションの状態を心配することができています。

私はここで何が欠けていますか?

答えて

39

セッションを照会することによって生成された一連のオブジェクトを、セッションの範囲外で使用できるようにするには、セッションのためにそれらをexpungeする必要があります。セッションが最初にように、すぐに閉じていないとしましょう、より一般的に

session.expunge_all() 

session.close() 

前:最初の関数の例では

は、次の行を追加する必要があります。例。おそらく、これは、Web要求の期間中、またはそのようなものの間、アクティブに維持されるセッションです。そのような場合は、expunge_allをしたくありません。あなたはより多くの外科になりたいでしょう:

for item in lst: 
    session.expunge(item) 
+17

しかし... ... "close()メソッドはexpunge_all()を発行し、トランザクション/接続リソースを解放します。"この文はあなたが参照したページにあり、少なくともバージョン0.6までです。 – Oddthinking

1

私の場合、私は同様に関連するエンティティを保存し、このレシピはrefreshに、セッション内のすべてのインスタンスを、私を助けて、セッションが反復可能であるという事実を活用:

map(session.refresh, iter(session)) # call refresh() on every instance 

これは非常に効果がありませんが、機能します。ユニットテストのためには問題ありません。

最終ノート:Python3 map()は何もしません。

+4

いずれの場合でも、結果を気にしない場合は 'map'を使用しないでください。 – ThiefMaster

関連する問題