簡體   English   中英

如何通過 SQLAlchemy 部分覆蓋 python 中的 sqlite3 db 中的 blob?

[英]How to partially overwrite blob in an sqlite3 db in python via SQLAlchemy?

我有一個包含二進制表示的 blob 列的數據庫,如下所示

DB Browser 顯示的 blob

我感興趣的值在標記中被編碼為 little endian unsigned long long (8 字節) 值。 像這樣讀取這個值可以正常工作

p = session.query(Properties).filter((Properties.object_id==1817012) & (Properties.name.like("%OwnerUniqueID"))).one()
id = unpack("<Q", p.value[-8:])[0]

上面例子中的 id 是 1657266。現在我想做的是相反的。 我有 object p 行,我有一個十進制格式的數字(出於測試目的使用相同的 1657266),我想以小端格式將該數字寫入相同的 8 字節。 我一直試圖通過 SQL 聲明這樣做

UPDATE properties SET value = (SELECT substr(value, 1, length(value)-8) || x'b249190000000000' FROM properties WHERE object_id=1817012 AND name LIKE '%OwnerUniqueID%') WHERE object_id=1817012 AND name LIKE '%OwnerUniqueID%'

但是當我這樣做時,我就無法再閱讀它了。 至少不是 SQLAlchemy。 當我嘗試與上面相同的代碼時,我收到錯誤消息Could not decode to UTF-8 column 'properties_value' with text '☻' ,因此看起來它是以不同的格式編寫的。 有趣的是,在 DB Browser 中使用普通的 select 語句仍然可以正常工作,並且 blob 仍然與上面的屏幕截圖完全一樣。 現在理想情況下,我希望能夠使用 SQLAlchemy ORM 僅寫入這 8 個字節,但我願意接受原始的 SQL 語句,如果它需要的話。

我通過基本上顛倒我用來閱讀它的過程,設法讓它與 SQLAlchemy 一起工作。 事后看來,使用 + 連接和 [:-8] 分割正確的部分似乎很明顯。

p = session.query(Properties).filter((Properties.object_id==1817012) & (Properties.name.like("%OwnerUniqueID"))).one()
p.value = p.value[:-8] + pack("<Q", 1657266)

通過為 SQLAlchemy 打開 ECHO,我得到了以下原始 SQL 語句:

UPDATE properties SET value=? WHERE properties.object_id = ? AND properties.name = ?
(<memory at 0x000001B93A266A00>, 1817012, 'BP_ThrallComponent_C.OwnerUniqueID')

如果你想手動做同樣的事情,這不是特別有用。

值得注意的是,我的問題中的原始 SQL 語句不僅適用於使用 DB Brower 閱讀它,而且適用於使用相關數據庫的游戲客戶端。 似乎只有 SQLAlchemy 有問題,試圖將其解碼為 UTF-8 似乎。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM