2012-07-05 108 views
0

我遇到了使用Django Models存儲在Postgres數據庫中的二進制數據(使用os.urandom(BLOCK_SIZE)創建)的情況。使用Django和Postgres在數據庫中存儲十六進制數據

我讀過幾個關於Django如何還不支持Bytea(VARBINARY)字段類型的參考。我發現了一個參考here,但不知道從哪裏得到這個庫(django_postgresql)。

我目前在Ubuntu 12.04上使用Python 2.7和Django 1.4 - 如果有幫助的話。

我讀過一些建議作爲解決這個問題的方法是在存儲它之前將我的數據轉換爲十六進制。

import binascii 
key = binascii.hexlify(value) 

好吧,現在是什麼?我想這個值保存到數據庫中,但得到的錯誤:

invalid byte sequence for encoding "UTF8": 0xd6c2

好,哪個數據字段類型,我應該用它來做到這一點?

key = models.TextField(max_length = 200)

key = models.CharField(max_length = 200)

key = models.???(max_length = 200) ???我想遠離創建我自己的custom field type。首先,我對Django非常陌生,並且不願意這樣做。其次,我對數據庫相當陌生,所以我不知道從哪裏開始定義這樣的東西。

有什麼建議嗎?

+0

什麼正在使用這些數據,以及如何大是'BLOCK_SIZE'是它可能會改變? – 2012-07-05 20:28:36

+0

@ Jon Clements這個數據代表了密碼學的一個關鍵。在這種情況下'BLOCK_SIZE'是32字節('os.urandom(32)')。 'BLOCK_SIZE'不會改變。 – Rico 2012-07-05 20:32:44

+0

檢查'type(key)'是'str'還是'unicode'。您可能需要'key.encode(「ASCII」)'如果unicode的... – 2012-07-05 20:41:17

回答

1

如果您在保存鍵值時發生Unicode錯誤,那麼您做錯了。 binascii.hexlify()返回一個簡單的十六進制字符串,它不會給你「無效的字節序列」。

對於更高效的存儲,使用base64編碼:

import base64 
mymodelinstance.key = base64.b64encode(raw_key_value) 

且解碼:

raw_key_value = base64.b64decode(mymodelinstance.key) 

你可以使用長度BLOCK_SIZE * 2的CharField持有十六進制數據,或4 * (BLOCK_SIZE/3)爲BASE64。

+0

謝謝,這解決了我的問題。你對錯誤是正確的,我做錯了。簡而言之,寫入數據庫時​​只是語法錯誤。 – Rico 2012-07-05 21:15:40

相關問題