1
from sqlalchemy.orm import Session
s = Session()
s.autoflush = False
s.autocommit = False

p1 = s.query(Person).first()
print p1 #prints 'Ivan Petrov', correct name of a person #1
p1.name = 'John Smith' #change the person's name

p2 = s.query(Person).first()
print p2 #prints 'John Smith', but the object wasn't flushed yet.

問題は、この状況を正しく処理するにはどうすればよいかということです。私がそう言うまでは、セッション (および p2) に影響を与えないように p1 を変更する必要があります。

4

2 に答える 2

3

セッションからオブジェクトを切り離すことができます:

session.expunge(p1)

再接続するには、次を試すことができます。

p2 = session.merge(p1)

または別のセッション オブジェクトを使用します。しかし、遅かれ早かれ、同じエンティティを操作しているという事実が明らかになります。

于 2012-08-20T13:51:46.023 に答える
0

SQLALchemy が正しく機能するように、かなりの作業が行われました。現在必要とされている方法ではありません。

SQLAlchemy の内部構造をあまり知らなくても、これを行う方法の 1 つは、変更するインスタンスを使用してプロキシ オブジェクトを作成し、そこにすべての変更を加えて、元のオブジェクトを変更するように指示された場合にのみ変更することです。

class AlchemyProxy(object):
    def __init__(self, obj):
        self._obj = obj
        self._changes = []

    def __setattr__(self, attr, value):
        self._changes.append((attr, value)
        # change the attributes in this instance
        return object.__setattr__(self, attr, value)

    def __getattr__(self, attr):
        # This is only called when the requested attribute was not
        return getattr(self._obj, attr)

    def _commit(self):
        for attr, value in self._changes:
            setattr(self._obj, attr, value)

そして、次のように使用します。

p1 = AlchemyProxy(s.query(Person).first())
于 2012-08-20T13:40:33.660 に答える