首页 > 数据库 > mysql教程 > 如何通过 SQLAlchemy 有效地使用 INSERT ... ON DUPLICATE KEY UPDATE?

如何通过 SQLAlchemy 有效地使用 INSERT ... ON DUPLICATE KEY UPDATE?

Mary-Kate Olsen
发布: 2024-11-24 10:31:11
原创
336 人浏览过

How Can I Efficiently Use INSERT ... ON DUPLICATE KEY UPDATE with SQLAlchemy?

使用 SQLAlchemy 进行优雅的重复键更新

问题:有没有一种无缝的方法来执行 INSERT ... SQLAlchemy 中的 ON DUPLICATE KEY UPDATE 使用类似于以下的语法inserter.insert().execute(list_of_dictionaries)?

答案:

MySQL 内置功能(自版本 1.2 起)

特别是对于 MySQL,SQLAlchemy 现在包含对 ON 的支持DUPLICATE KEY UPDATE。

SQL 语句中的 ON DUPLICATE KEY UPDATE

要在生成的 SQL 中显式包含 ON DUPLICATE KEY UPDATE,您可以使用 @compiles 装饰器:

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
登录后复制

这允许您将必要的字符串附加到生成的insert 语句:

my_connection.execute(my_table.insert(append_string='ON DUPLICATE KEY UPDATE foo=foo'), my_values)
登录后复制

ORM 中的 ON DUPLICATE KEY UPDATE 功能

虽然 SQLAlchemy 缺乏对 ON DUPLICATE KEY UPDATE 或 MERGE 的显式 ORM 支持,但它确实具有session.merge() 函数。不过,该函数仅对主键有效。

要模拟非主键的 ON DUPLICATE KEY UPDATE 功能,可以实现如下函数:

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
登录后复制

以上是如何通过 SQLAlchemy 有效地使用 INSERT ... ON DUPLICATE KEY UPDATE?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板