この記事は公開から2年以上経過しています。
Python(3.9) + SQLAlchemy(1.4) ORM + SQLite(3.39)を使用してUPSERTを行ってみたので、対応方法についての備忘録。
SQLAlchemyでORMを利用する方法については、過去のエントリー「PythonでOracle DatabaseからSQL Serverにデータをコピーする(ORM編)」をご参照下さい。
対応方法
SQLAlchemyのコンパイラ拡張を使い、ORMが生成するINSERT文にON CONFLICT DO NOTHING
サフィックスを付与する。
サンプルソースコード
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql import Insert
@compiles(Insert)
def suffix_insert(insert, compiler, **kw):
return compiler.visit_insert(insert, **kw) + ' ON CONFLICT DO NOTHING'
# SQLAlchemy ORMを使ったアプリケーションの処理
今回はSQLiteの場合について紹介しましたが、ORMが生成するSQLを書き換えることができるため、他のデータベースでも同様の対応できるかと思います。
SQLAlchemyコンパイラ拡張についての詳細は、参考ウェブサイトのSQLAlchemy公式ドキュメントをご参照ください。
参考ウェブサイトなど
-
SQLAlchemy Documentation
Changing the default compilation of existing constructs -
SQLite
SQL As Understood By SQLite/upsert
以上です。