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.

所以,问题是——我该如何正确处理这种情况?在我这样说之前,我需要对 p1 进行更改以不影响会话(和 p2)。

4

2 回答 2

3

您可以尝试从会话中分离对象:

session.expunge(p1)

要重新连接,您可以尝试:

p2 = session.merge(p1)

或者使用不同的会话对象。但迟早会出现你操纵同一个实体的事实。

于 2012-08-20T13:51:46.023 回答
0

在 SQLALchemy 中进行了大量工作,以使其以正确的方式工作 - 而不是您现在需要的方式。

在不了解 SQLAlchemy 内部原理的情况下,我可以想到的一种方法是使用您正在更改的实例创建一个代理对象,并在其中进行所有更改以仅在被告知时更改原始对象。

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 回答