INSERT ... ON DUPLICATE KEY UPDATE在SQLAlchemy中有一种优雅的方法吗?我的意思是语法类似于inserter.insert().execute(list_of_dictionaries)?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
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 compiles from 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 s
my_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 KEY UPDATE具有非主键(例如,另一个唯一键)的功能怎么办?不幸的是,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来源:stack overflow