gpt4 book ai didi

python - 重复 key 更新上的 SQLAlchemy

转载 作者:IT老高 更新时间:2023-10-28 22:14:40 29 4
gpt4 key购买 nike

有没有一种优雅的方式在 SQLAlchemy 中执行 INSERT ... ON DUPLICATE KEY UPDATE?我的意思是语法类似于 inserter.insert().execute(list_of_dictionaries) ?

最佳答案

ON DUPLICATE KEY UPDATE 发布 MySQL 1.2 版

此功能现在仅内置在 SQLAlchemy for MySQL 中。下面somada141的答案有最好的解决方案: https://stackoverflow.com/a/48373874/319066

ON DUPLICATE KEY UPDATE 在 SQL 语句中

如果您希望生成的 SQL 实际上包含 ON DUPLICATE KEY UPDATE,最简单的方法是使用 @compiles 装饰器。

可以在 on reddit 中找到示例代码(链接自主题 on 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 在其 ORM 层中不提供 ON DUPLICATE KEY UPDATEMERGE 或任何其他类似功能的接口(interface)。然而,它有 session.merge() 仅当相关键是主键时才能复制功能的函数

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

但是,如果您希望 ON DUPLICATE KEY UPDATE 功能具有非主键(例如,另一个唯一键),该怎么办?不幸的是,SQLAlchemy 没有任何这样的功能。相反,您必须创建类似于 Django 的 get_or_create() 的东西。 Another StackOverflow answer covers it ,为了方便起见,我将在此处粘贴修改后的工作版本。

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

关于python - 重复 key 更新上的 SQLAlchemy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6611563/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com