Python SQLAlchemy 批量插入时忽略重复键
Posted gcygeeker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python SQLAlchemy 批量插入时忽略重复键相关的知识,希望对你有一定的参考价值。
SQLAlchemy 批量插入的方法如 bulk_save_objects()
默认无法插入重复 key,如果插入会报错;而有时候我们需要忽略而非报错,经过研究发现下面代码可以解决这个问题:
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql import Insert
"""
When imported, automatically make all insert not fail on duplicate keys
"""
@compiles(Insert, "mysql")
def mysql_insert_ignore(insert, compiler, **kw):
return compiler.visit_insert(insert.prefix_with("IGNORE"), **kw)
@compiles(Insert, "postgresql")
def postgresql_on_conflict_do_nothing(insert, compiler, **kw):
statement = compiler.visit_insert(insert, **kw)
# IF we have a "RETURNING" clause, we must insert before it
returning_position = statement.find("RETURNING")
if returning_position >= 0:
return (
statement[:returning_position]
+ "ON CONFLICT DO NOTHING "
+ statement[returning_position:]
)
else:
return statement + " ON CONFLICT DO NOTHING"
在需要忽略重复 key 的代码块中 import 该 package 就可以。比如保存上述代码为insert_ignore.py
,然后在需要使用的地方:
import insert_ignore
...
session.bulk_save_objects(...)
注意控制使用的范围,在 import 的范围内所有插入遇到的重复 key 都会忽略
以上是关于Python SQLAlchemy 批量插入时忽略重复键的主要内容,如果未能解决你的问题,请参考以下文章
SQLAlchemy - 在 postgresql 中执行批量 upsert(如果存在,更新,否则插入)
Sqlalchemy - 当数据存在关系时,如何正确地将数据批量插入数据库
SQLAlchemy 在 Oracle DB 中批量插入 blob 数据