重复密钥更新时的SQLAlchemy

重复密钥更新时的SQLAlchemy,第1张

重复密钥更新时的SQLAlchemy
ON DUPLICATE KEY UPDATe
发布适用于MySQL的1.2版

现在,仅在MySQL的SQLAlchemy中内置了此功能。somada141的以下答案是最佳解决方案:https
://stackoverflow.com/a/48373874/319066


ON DUPLICATE KEY UPDATE
在SQL语句中

如果希望生成的SQL实际上包含

ON DUPLICATE KEY UPDATE
,则最简单的方法涉及使用
@compiles
装饰器。

的代码(来自关于该主题的很好的螺纹连接的上书签交易)中的示例,可以发现在github:

from sqlalchemy.ext.compiler import compilesfrom sqlalchemy.sql.expression import Insert@compiles(Insert)def append_string(insert, compiler, **kw):    s = compiler.visit_insert(insert, **kw)    if 'append_string' in insert.kwargs:        return s + " " + insert.kwargs['append_string']    return smy_connection.execute(my_table.insert(append_string = 'ON DUPLICATE KEY UPDATE foo=foo'), my_values)

但是请注意,在这种方法中,您必须手动创建append_string。您可能会更改append_string函数,以便它自动将插入字符串更改为带有“ ON
DUPLICATE KEY UPDATE”字符串的插入,但是由于懒惰,我在这里不打算这样做。

ON DUPLICATE KEY UPDATE
ORM中的功能

SQLAlchemy的不提供到接口

ON DUPLICATE KEY UPDATE
MERGE
或在其ORM层的任何其他类似的功能。但是,它具有
仅在所讨论的键是主键时
session.merge()
才能复制功能的功能。


session.merge(ModelObject)
首先通过发送
SELECT
查询(或在本地查找)来检查是否存在具有相同主键值的行。如果是这样,它将在某处设置一个标志,指示ModelObject已经在数据库中,并且SQLAlchemy应该使用
UPDATE
查询。请注意,合并比这要复杂得多,但是它可以使用主键很好地复制功能。

但是,如果您想要

ON DUPLICATE KEYUPDATE
具有非主键(例如,另一个唯一键)的功能怎么办?不幸的是,SQLAlchemy没有任何此类功能。相反,您必须创建类似于Django的内容
get_or_create()
。另一个StackOverflow答案涵盖了,为了方便起见,我将在此处粘贴其修改后的工作版本。

def get_or_create(session, model, defaults=None, **kwargs):    instance = session.query(model).filter_by(**kwargs).first()    if instance:        return instance    else:        params = dict((k, v) for k, v in kwargs.iteritems() if not isinstance(v, ClauseElement))        if defaults: params.update(defaults)        instance = model(**params)        return instance


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4991366.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存