使用SQLalchemy 0.6保存save_or_update

时间:2011-03-26 14:05:31

标签: python sql sqlalchemy

save_or_update已在0.6中删除。是否有替代品可以在0.6及以上使用它们?

我注意到会话对象存在方法_save_or_update_state,但此方法没有文档。

3 个答案:

答案 0 :(得分:2)

Michael Bayer answered this question :

  

update(),save_or_update(),save()都是   全部弃用。 add()放置一个   在所有情况下会话中的对象,   使用持久性信息   已经与对象相关联   确定INSERT或UPDATE。这个   意味着你是否只是做一个新的   Foo(id = some id),那是瞬态的 -   SQLAlchemy没有加载它。这将是   插入

     

请记住   Session维护着身份图   所有唯一的主键已经   加载到内存,以及   收到的国家   数据库。出于这个原因,你   一般不能只是放一个对象   会话中有一些任意数据,   并期望它“取而代之”   要加载的实际行   交易。 SQLAlchemy不会   知道怎么做因为它有   不知道有什么变化   与已经存在的这一行相比   当下。

     

如果你想创建一个   新的Foo(),主键可能   或者可能不存在   数据库,要合并状态   该对象的一个​​是   会议制作。使用   session.merge()用于此用例   这将加载现有对象   从当前交易中,如果有的话,   并合并你的外部状态   与它对象,返回   实例。传递给它的实例   保持不变,在外面   会话。

答案 1 :(得分:1)

Session.merge()适用于新对象和现有对象。但你必须记住,merge() 返回绑定到会话的对象而不是add()(旧版本中的save_or_update()),它将对象作为参数传递进入会议。需要此行为以确保会话中的每个标识都有一个对象。

答案 2 :(得分:0)

如果您将数据库设置作为主从设备,那么

session.merge()将不起作用,您通常希望从从设备进行查询,但写入主设备。我有这样的设置,最后在写入之前从主设备重新查询,然后使用session.add()如果主设备上确实没有数据。