python - 当多个已更改时,仅提交一个 SQLAlchemy 模型实例的更改

标签 python flask sqlalchemy flask-sqlalchemy

我查询并更改了几个实例。我只想将更改提交给其中一个。但是,当我调用 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/

相关文章:

python - 正确自动生成 __str__() 实现也适用于 sqlalchemy 类?

python - sqlalchemy 中的 scoped_session 问题 - 它是如何工作的?

python - 如何将python字典中的所有元素添加到数据库?

python - 如何等到 MySQLdb 游标完成运行所有查询

python - 通过pygame.sndarray播放正弦波时出错

templates - Flask 中的 Jinja2 模板无法呈现 CONTINUE 语句

python - 如何将文件从 Nodejs 发送到 Flask Python?

python - CVXPY:如何高效解决一系列类似问题

python - PySpark - 显示数据框中列数据类型的计数

python - 使用 Twitter Bootstrap 时通过 Flask Request 对象处理点击