Vic*_*Vic 7 python sqlalchemy flask 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()
Run Code Online (Sandbox Code Playgroud)
dav*_*ism 16
SQLAlchemy使用工作单元模式,而Django,Rails和许多其他ORM使用活动记录模式.这意味着属于一个会话的所有内容都充当一个单元.
您的问题揭示的不是SQLAlchemy的问题,而是您的工作流程的问题.如果您不想更改这些值,则不应更改它们.如果您错误地更改了某些内容,请将其从会话中删除而不是将其遗留下来.
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
Run Code Online (Sandbox Code Playgroud)
实际上,如果您确实需要单独的工作单元(您很可能不需要),请创建单独的会话并使用它们来查询单独的实例.
Flask-SQLAlchemy每个上下文使用一个会话,因此您的所有查询都将实例放在同一会话中.该query参数使用此默认会话.您可以通过调用创建单独的会话create_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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2001 次 |
| 最近记录: |