PythonでSQLiteにバイナリデータをUPDATEしようとして躓いたけど秒で解決した話【SQLite3】
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?"
ディスカッション
コメント一覧
まだ、コメントがありません