当前位置: 首页 > 知识库问答 >
问题:

SQLAlchemy批量upsert[副本]

马寒
2023-03-14
from sqlalchemy import *
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.automap import automap_base

import pg

engine = create_engine("postgresql+pygresql://" + uname + ":" + passw + "@" + url)

# reflectively load the database.
metadata = MetaData()
metadata.reflect(bind=engine)
session = sessionmaker(autocommit=True, autoflush=True)
session.configure(bind=engine)
session = session()
base = automap_base(metadata=metadata)
base.prepare(engine, reflect=True)

table_name = "arbitrary_table_name" # this will always be arbitrary
mapped_table = getattr(base.classses, table_name)
# col and col2 exist in the table.
chunks = [[{"col":"val"},{"col2":"val2"}],[{"col":"val"},{"col2":"val3"}]]

for chunk in chunks:
    session.bulk_insert_mappings(mapped_table, chunk)
    session.commit()
sqlalchemy.exc.IntegrityError: (pg.IntegrityError) ERROR:  duplicate key value violates unique constraint <constraint>

使用大型数据集进行批量更新的最佳方法是什么?我知道PostgreSQL现在支持upserts,但我不确定如何在SQLAlchemy中做到这一点。

共有1个答案

谷梁楷
2023-03-14

摘自https://stackoverflow.com/a/26018934/465974

在我找到这个命令后,我能够执行upserts,但值得一提的是,对于批量“upsert”来说,这个操作很慢。

另一种方法是获取您想要更新的主键列表,并查询数据库以获得任何匹配的ID:

 类似资料:
  • 问题内容: 在Slick 3.0中执行批量insertOrUpdate的正确方法是什么? 我正在使用适当的查询的MySQL MySQL批量插入或更新 这是我当前的代码,它很慢:-( 我正在寻找的是等价的 问题答案: 您可以通过多种方法使此代码更快(每个代码都 应该 比前面的代码更快,但是它的习惯用法越来越少): 运行而不是if on slick-pg 0.16.1+ 一次运行所有DBIO事件,而不

  • 我正在使用Postgres、NodeJS和Knex。 我有以下情况: > 具有唯一字段的数据库表 在NodeJS中,我有一个对象数组,我需要: 一种。如果表不包含唯一id,则插入新行,或 b.如果表包含唯一 ID,请更新其余字段。 据我所知,我有三种选择: 执行查询以检查数据库中是否存在每个,并根据响应执行更新或插入。这会消耗资源,因为每个数组项都有一个调用,还有一个插入或更新。 删除数组中具有

  • 问题内容: 我已经设法在SQLAlchemy中使用批量插入,例如: 我现在需要的是等效的更新。我已经试过了: 期望每一行都根据“ id”字段进行更新,但是它不起作用。我以为是因为我没有指定WHERE子句,但是我不知道如何使用字典中包含的数据指定WHERE子句。 有人可以帮我吗? 问题答案: 阅读文档的“插入,更新和删除”部分。以下代码将帮助您入门:

  • 这是我目前所拥有的,但它不起作用。如何连接所有内容?我认为问题在于逗号。