当前位置: 首页 > 面试题库 >

SQLAlchemy-在Postgresql中执行批量更新(如果存在,更新或插入)

李飞翼
2023-03-14
问题内容

我正在尝试使用SQLAlchemy模块(而不是SQL!)在python中编写大量upsert。

我在SQLAlchemy添加上遇到以下错误:

sqlalchemy.exc.IntegrityError: (IntegrityError) duplicate key value violates unique constraint "posts_pkey"
DETAIL:  Key (id)=(TEST1234) already exists.

我有一个称为列posts的主键的表id

在此示例中,我已经在数据库中使用了一行id=TEST1234。当我尝试将db.session.add()新对象id设置TEST1234为时,出现上述错误。我的印象是,如果主键已经存在,记录将得到更新。

我如何仅基于主键就可以对Flask-SQLAlchemy进行增补? 有没有简单的解决方案?

如果没有,我总是可以检查并删除具有匹配ID的任何记录,然后插入新记录,但是对于我的情况来说,这似乎很昂贵,因为我不希望有很多更新。


问题答案:

SQLAlchemy中有一个upsert-esque操作:

db.session.merge()

找到此命令后,我可以执行upsert,但是值得一提的是,对于批量“ upsert”而言,此操作很慢。

另一种方法是获取您要向上插入的主键的列表,并在数据库中查询任何匹配的ID:

# Imagine that post1, post5, and post1000 are posts objects with ids 1, 5 and 1000 respectively
# The goal is to "upsert" these posts.
# we initialize a dict which maps id to the post object

my_new_posts = {1: post1, 5: post5, 1000: post1000}

for each in posts.query.filter(posts.id.in_(my_new_posts.keys())).all():
    # Only merge those posts which already exist in the database
    db.session.merge(my_new_posts.pop(each.id))

# Only add those posts which did not exist in the database 
db.session.add_all(my_new_posts.values())

# Now we commit our modifications (merges) and inserts (adds) to the database!
db.session.commit()


 类似资料:
  • 问题内容: 我想向数据库表中添加一行,但是如果存在具有相同唯一键的行,我想更新该行。 例如: 假设唯一键为,并且在我的 数据库 中有一行。在这种情况下,我想用这些值更新该行。通常,这会产生错误。 如果使用它,将忽略该错误,但仍不会更新。 问题答案: 采用 查询:

  • 问题内容: 有没有办法像在MySQL服务器上那样批量执行查询? 将无法使用,因为如果该字段已经存在,它将直接忽略该字段并且不插入任何内容。 将无法工作,因为如果该字段已经存在,它将首先对其进行处理,然后再次进行处理,而不是对其进行更新。 可以使用,但不能批量使用。 因此,我想知道是否可以批量发出这样的命令(一次不止一次发送)。 问题答案: 您 可以 使用INSERT … ON DUPLICATE

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

  • 问题内容: 我在下面有一个SQL插入程序,它工作正常,但是我希望它检查DATE = xxxx,NAME = xxxx和JOB = xxx并更新HOURS(如果它们存在),否则插入新行。SQL可以做到这一点吗? 尝试以下具有相同结果的OR替换,每次都会添加一个新行。 例如: 如果以下内容位于数据库中,并且John要更新其工作时间,它将检查名称,日期,作业是否与尝试插入的值相同,并且它们是否仅更新HO

  • 我想向数据库表中添加一行,但如果存在具有相同唯一键的行,我想更新该行。 我的问题是: 但是,它将继续插入新的记录。假设是唯一键。如果存在,则不会将新记录插入数据库;同时更新记录。 我也试过这个: 我不确定我的代码是否存在for循环问题。 我使用for循环插入所有数据。 这是echo$query的输出; SQL表