【问题标题】:Python SQLAlchemy ON DUPLICATE KEY UPDATE with multiple recordsPython SQLAlchemy ON DUPLICATE KEY UPDATE 与多条记录
【发布时间】:2019-12-11 17:49:29
【问题描述】:

我想使用 SQLAlchemy 提供的 ON DUPLICATE KEY UPDATE 选项来更新一组记录。

这些记录已经成功地被python使用以下方法插入(其中connection是engine.connect()对象,table是一个Table对象)

record_list = [{'col1': 'name1', 'col2': '2015-01-31', 'col3': 27.2},
               {'col1': 'name1', 'col2': '2016-01-31', 'col3': 25.2}]
query = insert(table)
results = connection.execute(query, record_list)

查看https://docs.sqlalchemy.org/en/13/dialects/mysql.html#insert-on-duplicate-key-update-upsert 的文档以及一些 SO 问题(包括在SQLAlchemy ON DUPLICATE KEY UPDATE 的 cmets 下可能提出的建议)我尝试了许多不同的示例,但没有一个我可以使用此方法使用 upsert 语句查看该地址的多条记录。

我正在尝试

query = insert(table).values(record_list)
upsert_query = query.on_duplicate_key_update()
results = connection.execute(upsert_query)

但要么得到 .on_duplicate_key_update() 要求不能为空或 SQL 语法错误的问题。

如果有人成功管理并可以帮助我解决这里的代码结构,我将不胜感激。

【问题讨论】:

    标签: python mysql sqlalchemy


    【解决方案1】:

    我刚刚遇到了一个类似的问题,并用 query.inserted 创建了一个字典为我解决了这个问题。

    query = insert(table).values(record_list)
    update_dict = {x.name: x for x in insert_stmt.inserted}
    upsert_query = query.on_duplicate_key_update(update_dict)
    

    【讨论】:

      【解决方案2】:

      您的 on_duplicate_key_update 函数需要定义要插入更新的数据的参数。请查看您已经找到的文档中的示例。

      insert().on_duplicate_key_update({"key": "value"})
      

      【讨论】:

      • 感谢您的回复。我尝试再次传入record_list(这是一个字典列表),但这没有用 - 我认为字典是预期的。知道在更新多个记录的情况下需要什么吗?谢谢
      • 只是为了澄清上述内容,我尝试了 insert.on_duplicate_key_update(record_list)
      • 文档给出了多个更新的示例,使用字典和列表:on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update( {"data": "some data", "updated_at": func.current_timestamp()}, )on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update( [ ("data", "some data"), ("updated_at", func.current_timestamp()), ], )
      • record_list 是一个带有单个字典的列表,因为它是唯一的条目,而不是字典。你可以检查type(record_list)
      • 也许我理解错了,但我在文档中看到这些示例更新单个记录,其中多列由 dict 键标识,记录/行是 dict 值。就我的变量 record_list 而言,它是一个包含 2 个字典的列表,每个字典代表一个不同的记录 - 我实际上试图添加更多内容,但为了清楚起见,在我的示例中仅限于 2 个。
      猜你喜欢
      • 2014-06-05
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 2010-10-07
      • 2018-05-22
      相关资源
      最近更新 更多