关于SQLAlchemy中update的使用参数synchronize_session

发布时间 2023-06-03 17:31:15作者: pywjh

update语句带上synchronize_session="fetch"或者带上synchronize_session=False是啥区别

在SQLAlchemy中,当您使用update语句更新数据库中的记录时,可以使用`synchronize_session`参数来指定要同步的会话对象。

- 当`synchronize_session`设置为`False`时,会话对象不会自动同步,这意味着您需要手动调用`session.commit()`来提交更改。
- 当`synchronize_session`设置为`fetch`时,会话对象将自动在更新操作完成后刷新所有相关对象的状态。这意味着在更新操作完成后,您可以立即访问已更新的数据。

因此,如果您希望在更新操作完成后立即访问已更新的数据,则应将`synchronize_session`设置为`fetch`。如果您不需要立即访问已更新的数据,则可以将其设置为`False`,并稍后手动提交更改。

但是不论哪个参数,都是要commit了之后才会写进数据库的吧

是的,无论您使用`synchronize_session`参数的哪个选项,都需要在更新操作完成后手动提交更改,即调用`session.commit()`方法,才能将更改写入数据库。`synchronize_session`参数只是控制会话对象何时将更新后的数据刷新到相关对象中,而不是何时将更改写入数据库。

所以synchronize_session=False,然后flush,和fetch是一样的效果对吧

不完全一样。`flush()`方法将在会话对象中缓冲的所有挂起更改写入数据库,但不会将数据库中的数据同步到相关对象中。而`synchronize_session='fetch'`参数将在更新操作完成后自动刷新所有相关对象的状态,这意味着您可以立即访问已更新的数据,而无需手动调用`session.flush()`或`session.commit()`方法。

因此,如果您需要立即访问已更新的数据,则应使用`synchronize_session='fetch'`参数。如果您只需要将更改写入数据库,但不需要立即访问已更新的数据,则可以使用`flush()`方法或将`synchronize_session`参数设置为`False`,并稍后手动提交更改。

那什么都不传,默认是什么

如果您在使用`update()`方法时不传递`synchronize_session`参数,则会使用默认值`'evaluate'`。这意味着会话对象将根据需要自动判断何时同步相关对象的状态。在大多数情况下,这将产生预期的结果,但如果您需要更细粒度地控制何时同步状态,则应显式指定`synchronize_session`参数。

那我的代码中途flush了,之后没有commit就因为别的原因return給请求端了,数据会更新进数据库吗

不会。如果您在调用`flush()`方法后未调用`commit()`方法,并且会话对象未提交更改,则更改不会写入数据库。在这种情况下,如果您的代码在`flush()`方法后返回响应,则更改将被回滚,即不会更新到数据库中。

如果您希望确保更改写入数据库,则应在执行完所有操作后调用`commit()`方法。如果在执行操作期间发生错误,则应捕获异常并回滚会话对象,以避免将部分更改写入数据库。