SQLAlchemy - INSERT OR REPLACE等效项

hon*_*zas 11 python sqlalchemy

有谁知道SQLAlchemy中的SQL"INSERT OR REPLACE"子句及其SQL表达式语言的等价物是什么?

非常感谢 - honzas

Had*_*ien 9

怎么样Session.merge

Session.merge(instance, load=True, **kw)
Run Code Online (Sandbox Code Playgroud)

将实例的状态复制到具有相同标识符的持久实例上.

如果当前没有与会话关联的持久性实例,则将加载该实例.返回持久化实例.如果给定实例未保存,请保存副本并将其作为新的持久实例返回.给定的实例不会与会话关联.如果使用cascade ="merge"映射关联,则此操作会级联到关联的实例.

来自http://www.sqlalchemy.org/docs/reference/orm/sessions.html


M. *_*AYA 6

Session.save_or_update(model)
Run Code Online (Sandbox Code Playgroud)

  • 无论如何,这是0.4特定的SQLA,对于0.5你必须使用Session.add(模型) (2认同)

DNS*_*DNS 5

我不认为(如果我错了,请纠正我)INSERT OR REPLACE 不属于任何 SQL 标准;这是特定于 SQLite 的东西。有 MERGE,但也不是所有方言都支持。所以它在 SQLAlchemy 的通用方言中不可用。

最干净的解决方案是使用 Session,正如 M. Utku 所建议的那样。您也可以使用 SAVEPOINT 来保存,尝试:插入,除了 IntegrityError:然后回滚并进行更新。第三种解决方案是使用 OUTER JOIN 和 WHERE 子句编写 INSERT,该子句过滤具有空值的行。