2012-07-05 110 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

相关问题