首页  >  文章  >  数据库  >  如何在 SQLAlchemy 中实现 INSERT ... ON DUPLICATE KEY UPDATE 功能?

如何在 SQLAlchemy 中实现 INSERT ... ON DUPLICATE KEY UPDATE 功能?

Susan Sarandon
Susan Sarandon原创
2024-11-23 21:21:12155浏览

How Can I Achieve INSERT ... ON DUPLICATE KEY UPDATE Functionality in SQLAlchemy?

SQLAlchemy 中的优雅 ON DUPLICATE KEY UPDATE

SQLAlchemy 缺乏使用以下命令执行“INSERT ... ON DUPLICATE KEY UPDATE”操作的无缝解决方案它的 ORM 层。但是,有一些解决方法可以实现类似的功能。

内置 MySQL 支持

对于 MySQL 数据库,SQLAlchemy 现在提供对 ON DUPLICATE KEY UPDATE 的内置支持。这可以使用以下语法来实现:

inserter = my_table.insert()
inserter.execute(list_of_dictionaries)

参数化 ON DUPLICATE KEY UPDATE

在为其他对象生成的 SQL 语句中包含 ON DUPLICATE KEY UPDATE 子句数据库,您可以使用装饰器来附加所需的string:

@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)

主键的 ORM 功能

对于唯一键为主键的 ORM 对象,可以使用 SQLAlchemy 的 session.merge() 函数复制重复密钥更新功能:

session.merge(ModelObject)

非主键的自定义实现

对于非主键唯一约束,可以创建一个类似于 Django 的 get_or_create() 的自定义函数来实现期望的行为:

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

以上是如何在 SQLAlchemy 中实现 INSERT ... ON DUPLICATE KEY UPDATE 功能?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn