INSERT ... ON DUPLICATE KEY UPDATE
在SQLAlchemy中有一种优雅的方法吗?我的意思是语法类似于inserter.insert().execute(list_of_dictionaries)
?
现在,仅在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
我找遍了,但没有找到是否可能。 我有一个MySQL查询: 字段id有一个“唯一索引”,所以不能有两个。现在,如果数据库中已经存在相同的id,我想更新它。但我真的必须再次指定所有这些字段吗,比如: 或: 我已经在插入中指定了所有内容。。。 一个额外的注意事项,我想使用周围的工作来获得ID! 我希望有人能告诉我什么是最有效的方法。
如何使用选项编写原则查询?
问题内容: 我没有看到重复的约束。它在哪里? 问题答案: 这很可能是因为您至少命名了一个约束,且其标识符与列相同: 应该为约束使用其他标识符,例如: 和表中的相同: 这些是我看到的仅有的三个,但可能还有其他我想念的。
我基于以下示例实现了这一点:https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/
我有一个具有两列主键的表。 未捕获的异常“PDOException”,包含消息“SQLSTATE[23000]”:完整性约束违反:1062中键“Primary”的重复项“157-433”... 为什么它不只是更新现有的(157,433)-行?
好的,这个问题不是关于如何返回ID,而是更像是如何跳过它...我有一种情况,我使用last_insert_id()获取最后插入的行的id,但如果没有插入行,我希望得到一个零。问题如下: I INSERT...UPDATE一些记录:由于行是新插入的,因此返回所有ID 然后重复这个过程:这一次不返回ID。耶!这正是我想要的 我更改了一个列值并重复该过程:但现在返回了我更改了列值的行的ID。这让我很生气