PythonでSQLiteにバイナリデータをUPDATEしようとして躓いたけど秒で解決した話【SQLite3】

Python基礎

スポンサーリンク

SQLiteに限定して書いていますが、他のSQLにも当てはまるかもしれません。

概要

PythonでSQLite3にバイナリデータしようと、何も考えずに以下のように記述したらエラーが発生しました

サンプルコード

import sqlite3

# データベースに接続
conn = sqlite3.connect('your_database.db')
cursor = conn.cursor()

# バイナリデータを定義
binary_data = b'...'  # バイナリデータ
where_data = 'something'

# UPDATEクエリを実行
cursor.execute(f"UPDATE TABLE_NAME SET BINARY = {binary_data} WHERE DATA = {where_data}")

# 変更をコミット
conn.commit()

# 接続を閉じる
conn.close()

with文を使うのが実践的ですが、今回はあくまで基本形で。

エラー内容

"###binary data###"の部分は改変していますが、入力したバイナリデータが表示されています。

sqlite3.OperationalError: near "###binary data###": syntax error

ガッツリとエラーが出ていることが確認できます。

解決策

バイナリデータを直接文字列化してしまったことが原因で、cursor.executeのf-stringsの部分を以下のように書き換えることで解決しました。

import sqlite3

# データベースに接続
conn = sqlite3.connect('your_database.db')
cursor = conn.cursor()

# バイナリデータを定義
binary_data = b'...'  # バイナリデータ
where_data = 'something'

# UPDATEクエリを実行
cursor.execute(f"UPDATE TABLE_NAME SET BINARY = ? WHERE DATA = ?", (binary_data, where_data))

# 変更をコミット
conn.commit()

# 接続を閉じる
conn.close()

おまけ

本題とは関係ありませんが、いろいろと探していると、こんな分かりやすい画像を見つけたので載せておきます。
UPDATEの構造が図式化されています。

こういう中身のロジックは知る機会が少ないので、単純な失敗から巡り会えて良かったです。

【Reference】

stack overflow – “syntax to UPDATE a BLOB field in an existing SQLite record?"