我查询并更改了几个实例。我只想将更改提交给其中一个。但是,当我调用 db.session.commit()
时,所有更改都已提交.有没有办法单独保存一个对象,object.save()
,比如 Rails 或 Django?
rule_1 = Rule.query.filter(Rule.something.like(that_thing))
rule_1.change_message = "Duplicate"
rule_2 = Rule.query.filter(Rule.something.like(that_thing))
rule_2.change_message = "This is 2nd Duplicate Message"
rule_3 = Rule.query.filter(Rule.something.like(that_thing))
rule_3.change_message = "This is the THIRD Duplicate Message"
# What I want
rule_3.save()
最佳答案
SQLAlchemy 使用工作单元模式,而 Django、Rails 和许多其他 ORM 使用事件记录模式。这意味着属于一个 session 的所有内容都充当一个单元。
您的问题揭示的不是 SQLAlchemy 的问题,而是您的工作流程的问题。如果您不想更改这些值,则不应更改它们。如果您错误地更改了某些内容,请将其从 session 中删除,而不是将其留在原处。
rule1.change_message = 'changed rule 1'
db.session.expunge(rule1)
# no longer part of the session, will not be committed
# use db.session.add(rule1) to track it again
如果您确实确实需要单独的工作单元(您很可能不需要),请创建单独的 session 并使用它们来查询单独的实例。
Flask-SQLAlchemy 每个上下文使用一个 session ,因此您的所有查询都将实例放在同一个 session 中。
query
参数使用此默认 session 。您可以通过调用 create_session
创建单独的 session .确保手动清理这些 session 。session1 = db.create_session({})
rule1 = session1.query(Rule).filter_by(name='rule1').one()
rule1.message = 'message'
session2 = db.create_session({})
rule2 = session2.query(Rule).filter_by(name='rule2').one()
rule2.message = 'message'
session2.commit() # only commits rule2
session1.close()
session2.close()
关于python - 当多个已更改时,仅提交一个 SQLAlchemy 模型实例的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37191141/