使用Django和Postgres将十六进制数据存储在DB中

时间:2012-07-05 20:22:17

标签: python django postgresql binary-data

我遇到过我需要使用Django Models存储在Postgres数据库中的二进制数据(使用os.urandom(BLOCK_SIZE)创建)的情况。

我已经读过几个关于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很陌生,对此感到不舒服。其次,我对数据库很陌生,所以我不知道从哪里开始定义这样的东西。

有什么建议吗?

1 个答案:

答案 0 :(得分: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。