Nano Hash - криптовалюты, майнинг, программирование

как распаковать двоичные данные, хранящиеся в postgresql, с помощью модуля psycopg2 в python?

Я использую cPickle и psycopg2 для хранения некоторых векторов в базе данных. Это мой код для хранения двоичных данных

binary_vec = cPickle.dumps(vec, -1)
db.cur.execute('''
               INSERT INTO feature_vector (vector, id) 
               VALUES (%s, %s);
               ''', (psycopg2.Binary(binary_vec), thread_id)
db.conn.commit()

Однако, когда я использую fetchall() для обратной загрузки данных, тип буфера. Я не могу найти, как восстановить этот буферный объект обратно в список (vec).

Вот как я получаю данные

db.cur.execute("SELECT * FROM feature_vector;")
m = db.cur.fetchall()

Результат выглядит так

[(3169187, <read-only buffer for 0x1002b0f10, size 3462, offset 0 at 0x1004a7430>), 
(3169275, <read-only buffer for 0x1002b0f50, size 3462, offset 0 at 0x1004a7570>), 
(3169406, <read-only buffer for 0x1002b0f70, size 3462, offset 0 at 0x10140b0b0>), 
(3169541, <read-only buffer for 0x10141c030, size 3462, offset 0 at 0x10140b2b0>), 
(3169622, <read-only buffer for 0x10141c050, size 3462, offset 0 at 0x10140b3f0>),...

Когда я пытаюсь использовать cPickle.loads(m[0][1]), он возвращает сообщение об ошибке

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be string, not buffer

  • Проверяли ли вы вручную (например, mysql -e 'select * from ...'), что данные действительно хранятся в базе данных? 02.12.2012
  • Да, данные хранятся в базе данных. Выглядит это так 03.12.2012
  • было бы полезно, если бы вы вставили код для извлечения.. 03.12.2012
  • Вы пробовали str(the_buffer) или bytes(the_buffer)? 03.12.2012
  • О, теперь работает, спасибо! 03.12.2012
  • И вот я, немного далеко в будущем, задаюсь вопросом, что работает, а что нет... пока не попробую сам. 16.03.2021

Ответы:


1

Вы можете создать настраиваемый приведение типов для автоматического преобразования маринованных значений в Python:

import cPickle
obj = {'a': 10}
data = cPickle.dumps(obj, -1)

import psycopg2

def cast_pickle(data, cur):
    if data is None: return None
    return cPickle.loads(str(psycopg2.BINARY(data, cur)))

psycopg2.extensions.register_type(
    psycopg2.extensions.new_type(
        psycopg2.BINARY.values, 'BINARY-PICKLE', cast_pickle))

cnn = psycopg2.connect('')
cur = cnn.cursor()
cur.execute("select %s::bytea", [psycopg2.Binary(data)])
cur.fetchone()
# ({'a': 10},)
04.12.2012
  • в данных мы должны использовать объект возврата курсора? 19.02.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..