Правильный способ конвертировать bytea из Postgres обратно в строку в Python

У меня есть небольшой скрипт, в котором я генерирую хэши SHA1, беру двоичное представление через hexdigest хешлиба и сохраняю их в БД Postgres со столбцом bytea. У меня есть запрос, который выглядит в Postgres (сокращенно):

SELECT * FROM some_table WHERE some_hash in decode(another_hash, 'hex')

При выполнении запроса у меня есть код, который выглядит следующим образом:

cur.execute(query)
for hash_rep in cur:
    print bhash

Теперь в этом операторе print он будет либо выводить неразборчивые символы, либо, если я его поменяю на:

print str(psycopg2.Binary(bhash))

Я получаю что-то вроде:

'\214p\203\030\017K\247\373o\253'::bytea

Как правильно преобразовать его обратно в исходную строку? Исходные представления являются чем-то вроде "30d22d5d64efe4c5333e", и я хотел бы вернуть его к этой исходной строке для сравнения. Я не уверен, что упускаю что-то очевидное,

1 ответ

Решение

Поскольку вы попросили Postgres декодировать вашу шестнадцатеричную строку и сохранить ее в двоичном виде, вы должны попросить postgres закодировать ее обратно в шестнадцатеричный формат при выводе.

SELECT encode(some_hash, 'hex'), * FROM some_table WHERE some_hash in decode(another_hash, 'hex')

В качестве альтернативы, вы можете сделать кодирование в Python. Попробуйте binascii.hexlify (data).

Другие вопросы по тегам