Разблокировать элемент, который был обработан с помощью SQLAlchemy «вручную» - PullRequest
1 голос
/ 05 апреля 2019

У меня есть приложение, которое добавляет некоторые элементы Python в базу данных. Код SQLAlchemyCode выглядит следующим образом:

class DatabaseTable(base):
    __tablename__ = 'TableName'
    id = db.Column(Integer, primary_key=True, autoincrement=True)
    pickeled_element_column = Column(sqlalchemy.types.PickleType, nullable=False)

Нет, я могу поместить элементы в свою базу данных с помощью:

db_object = DatabaseTable()
db_object.pickeled_element_column = object_to_pickle
session.add(db_object)
session.commit()

Пока это работает.

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

Я думал копировать мой объект вручную из базы данных в строку python внутри jupyter. Строка маринада из моей базы данных выглядит так:

pickle_string = 0x800495FF020000000...5622E

Когда я не пытаюсь распаковать эту строку, я получаю переполнение стека невыполнения Ошибка:

pickle.loads(pickle_string.encode())

---------------------------------------------------------------------------
UnpicklingError                           Traceback (most recent call last)
<ipython-input-508-58d250332c2d> in <module>()
      1 pickeled_string = "0x800495FF020000..E"
      2 
----> 3 pickle.loads(pickeled_string.encode())

UnpicklingError: unpickling stack underflow

Итак, вот мой вопрос. Как скопировать элемент, выбранный в базу данных с помощью SQLAlchemy, и отменить его выбор в другом месте.

1 Ответ

2 голосов
/ 06 апреля 2019

0x800495FF020000..E является двоичной константой T-SQL или другими словами, как SQL Server отображает двоичные данные. pickle в Python, с другой стороны, ожидает bytes - не строка, содержащая представление двоичной константы T-SQL. Вам придется преобразовать представление, прежде чем вы сможете открепить свой объект:

# I'll assume you actually have the full binary string without the `..` truncation
binary_constant = "0x800495FF020000..E"
pickled_data = bytes.fromhex(binary_constant[2:])
obj = pickle.loads(pickled_data)

Если вы все еще используете Python 2 (вам нужно перейти на 3), что, как вам кажется, дает pickle.loads() возможность принимать строковое значение, вам придется использовать немного другой метод:

import binascii

binary_constant = "0x800495FF020000..E"
pickled_data = binascii.unhexlify(binary_constant[2:])
obj = pickle.loads(pickled_data)      
...