MySQL Sqlalchemy 的 add_all() 函数来忽略重复的键值并避免 IntegrityError 异常
在本文中,我们将介绍如何使用 MySQL Sqlalchemy 的 add_all() 函数来忽略重复的键值(duplicate key)并避免 IntegrityError 异常。
阅读更多:MySQL 教程
Sqlalchemy add_all() 函数简介
Sqlalchemy 是一个流行的 Python ORM 库,它允许开发人员使用 Python 代码来执行数据库操作,而无需编写原生的 SQL 语句。Sqlalchemy 中有一个函数 add_all(),可以将一组模型对象添加到数据库中。
使用 add_all() 函数时,如果数据库中已经存在相同键值的记录,Sqlalchemy 默认会抛出 IntegrityError 异常,提示重复键值。可以通过设置参数来指示 Sqlalchemy 忽略这些重复的键值。
忽略重复键值
在 Sqlalchemy 里,我们可以通过设置一个 model 的 UNIQUE 属性来保证数据库中不会存在重复的记录。但是,当我们使用 add_all() 函数插入数据时,如果碰到已经存在的重复记录,Sqlalchemy 就会抛出 IntegrityError 异常。这个时候,我们可以使用 on_duplicate_key_ignore 插件来忽略这个异常。
from sqlalchemy.dialects.mysql import insert
from sqlalchemy.orm import Session
from your_app import models # 导入模型
session = Session()
models_list = [
models.SomeModel(...),
models.SomeModel(...),
...
]
insert_stmt = insert(models.SomeModel).values(models_list)
on_duplicate_key_stmt = insert_stmt.on_duplicate_key_ignore()
session.execute(on_duplicate_key_stmt)
session.commit()
在这个例子中,我们首先定义了一个 Session 对象,然后定义了一个待插入的模型列表 models_list,这个列表包含了待插入的模型对象。接着,我们使用 insert() 函数构造了一个插入语句 insert_stmt,并使用 on_duplicate_key_ignore() 函数对它进行了处理,从而忽略了重复键值。最后,我们调用 session.execute() 函数执行 SQL 语句并提交事务。
注:这个例子中用到的 on_duplicate_key_ignore 插件需要安装第三方库 sqlachemy-utils,可使用 pip 安装:pip install sqlalchemy-utils。
on_duplicate_key_update 插件
除了使用 on_duplicate_key_ignore 插件忽略重复键值外,我们还可以使用 on_duplicate_key_update 插件来更新已存在的记录。当需要插入的记录已经存在时,Sqlalchemy 会触发 update 语句,更新已存在的记录。如果该记录不存在,则会插入一条新记录。
from sqlalchemy.dialects.mysql import insert
from sqlalchemy.orm import Session
from your_app import models # 导入模型
session = Session()
models_list = [
models.SomeModel(...),
models.SomeModel(...),
...
]
insert_stmt = insert(models.SomeModel).values(models_list)
on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update(
some_field=insert_stmt.inserted.some_field, # 更新的字段
some_other_field=insert_stmt.inserted.some_other_field, # 更新的字段
...
)
session.execute(on_duplicate_key_stmt)
session.commit()
在这个例子中,我们使用 on_duplicate_key_update() 函数将待插入的记录的某些字段和已存在记录中的字段进行比较,如果相等,则将待插入记录的其他字段插入到数据库中,否则更新已存在字段的值。
总结
在本文中,我们介绍了如何使用 MySQL Sqlalchemy 的 add_all() 函数来忽略重复的键值并避免出现 IntegrityError 异常。我们还介绍了如何使用 on_duplicate_key_ignore 插件和 on_duplicate_key_update 插件来处理重复键值的情况。这些方法有利于我们快速地向数据库中插入大量数据。