在SQLAlchemy中禁用提交对象更改

kja*_*llo 7 python mysql sqlalchemy

我在不是Web应用程序的项目中使用SQLAlchemy.它是一个服务器应用程序,它从数据库加载许多不同的对象并在本地修改它们,但是每次发出提交时都不希望将这些更新保存到数据库中.我以前和Django ORM合作过一些网络项目,发现它更适合我想要实现的目标.在Django ORM中我可以随时随地使用.save()每个对象而不保存其他我可能不想保存的东西.我理解为什么它在SQLAlchemy中的工作方式如此,但我想知道如何以类似Django的方式做到这一点?


更新: 为了更容易理解我想要实现的目标,我将为您提供一个示例.

这是它实际工作的方式:

a = MyModel.query.get(1)
b = MyModel.query.get(1)

a.somefield = 1
b.somefield = 2

# this will save both of changed models
session.commit()
Run Code Online (Sandbox Code Playgroud)

这就是我希望它的工作方式:

a = MyModel.query.get(1)
b = MyModel.query.get(1)

a.somefield = 1
b.somefield = 2

a.save()
# I didn't want to save b, changes of b weren't committed
Run Code Online (Sandbox Code Playgroud)

我想更好地控制实际保存的内容.我想每5分钟左右保存每个对象的更改.

Dhr*_*awa 4

我用类似的东西:

class BaseModel(object):
    def save(self, commit=True):
        # this part can be optimized.
        try:
            db.session.add(self)
        except FlushError:
            # In case of an update operation.
            pass

        if commit:
            db.session.commit()

    def delete(self, commit=True):
        db.session.delete(self)

        if commit:
            db.session.commit()
Run Code Online (Sandbox Code Playgroud)

然后我将模型定义为:

class User(db.Model, BaseModel)
Run Code Online (Sandbox Code Playgroud)

所以,现在我可以这样做:

u = User(username='foo', password='bar')
u.save()
Run Code Online (Sandbox Code Playgroud)

这就是您计划实现的目标吗?