20

したがって、sqlalchemy を使用して学習します。

インスタンスがあり、値を取得する必要があります。その値が存在する場合は、それを返します。そうでない場合は、計算して返します。

必ず誰かが「あなたのやり方は間違っている」と言い、改善に関する意見は一般的に高く評価されます。ただし、私が取り組んでいるものは成長し始めており、インスタンスを更新したいときにセッションを常に管理するのは問題があるため、明示的にセッションを管理する必要なくこれを行う方法を検討しています。それは私実際に間違ったことをしていると私に思わせます。

それでは、セッションを明示的に管理しないように以下のメソッドを修正するにはどうすればよいでしょうか?

def method(self, session):
        if self.i_needed_this is None:
            self.i_needed_this = calculate(calcutron)
            session.add(self)
            session.commit()
            return self.i_needed_this                        
        else:
            return self.i_needed_this

おそらく、この質問は「インスタンスをセッション対応にするので、常に明示的に管理しているわけではありません」というタイトルにする必要があります.

編集:どうやら、私が使用しているセッションのインポートは機能しており、それは利用可能であるため、おそらく問題ではないか、sqlalchemy のスキルが向上した場合の将来の問題です。

4

2 に答える 2

32

あなたの質問は非常に一般的であるため、その回答は SA ドキュメントのセッションよくある質問に記載されています。

  • 特定のオブジェクトのセッションを取得するにはどうすればよいですか? Session で利用可能なobject_session ()クラスメソッドを使用します。
    session = Session.object_session(someobject)

ただし、オブジェクトが永続的であり、新しい (ただしセッションに既に追加されている) か、セッションにバインドされていることを前提としています。サンプル コードには、オブジェクトをセッションに追加するロジックが含まれているため、この場合、私の仮定は当てはまらない可能性があります。

于 2012-06-04T16:47:56.237 に答える
15

特定のオブジェクトのセッションを取得する方法を参照してください。:

  • SA ランタイム検査 API を使用できます。

    from sqlalchemy import inspect
    # ...
    # within instance method
    session = inspect(self).session
    
  • またはobject_session()方法:

    from sqlalchemy.orm.session import Session
    # ...
    # within instance method
    session = Session.object_session(self)
    
于 2014-03-27T14:46:19.190 に答える