2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Python同梱のSQLiteで、UPSERTを使う

Last updated at Posted at 2022-03-03

PythonからSQLite使用時にUPSERTが使いたくなって調べてみましたが、使えるようです。

UPSERT is a special syntax addition to INSERT that causes the INSERT to behave as an UPDATE or a no-op if the INSERT would violate a uniqueness constraint. UPSERT is not standard SQL. UPSERT in SQLite follows the syntax established by PostgreSQL. UPSERT syntax was added to SQLite with version 3.24.0 (2018-06-04). SQLite Query Language: upsert

ただ環境によっては、より古いバージョンのSQLiteしか入っていないことがあると思います。

>>> import sqlite3
>>> conn = sqlite3.connect(":memory:")
>>> conn.execute("select sqlite_version()").fetchone()
(u'3.22.0',)

解決策

古いバージョンを前提に対応方法をググると、「SQLiteでUPSERTの場合は、INSERT or REPLACE文にすればよい」という記事がありますが、これは少し乱暴な書き方かと思います。

一般的にUPSERTでやりたいことについて、厳密には二種類あります:

  • ケースA) 既存レコードを入れ替える際、既存レコードのカラム値を捨てる
  • ケースB) 既存レコードを入れ替える際、既存レコードの他のカラム値を維持する

INSERT or REPLACEが使えるのは、A)の場合のみになります。

今回はB)にしたかったので、こう解決しました:

  1. INSERTとUPDATEでSQLを2つに分けて、INSERT→UPDATEの順に実行
  2. INSERTでは、レコードを作るのみとする(キー値のみ入れる)
  3. UPDATEで、値を入れる ※直前のINSERT時と同じWHERE条件を使う

参考

記事の内容はあくまで個人の考えに基づくものであり、組織を代表するものではありません。

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?