Как записать байты в Blob в SQLAlchemy - PullRequest
0 голосов
/ 18 июня 2019

У меня есть следующее определение таблицы:

class UserExtensibleData(CommonDeclarativeBase.DECLARATIVE_BASE):
    __tablename__ = 'user_extensible_data'
    id = Column(BIGINT(unsigned=True), primary_key=True, nullable=False)
    user_id = Column(BIGINT(unsigned=True), ForeignKey(User.id), nullable=False, unique=True)
    # using _blob so client is aware that it is a blob, since UserPreferences is a proto object
    user_preference_blob = Column(BLOB, nullable=True)
    unix_timestamp_last_update_seconds = Column(INTEGER, nullable=False)

    def __init__(self, user_id: int, user_preference_blob, unix_timestamp_last_update_seconds: int):
        self.user_id = user_id
        self.user_preference_blob = user_preference_blob
        self.unix_timestamp_last_update_seconds = unix_timestamp_last_update_seconds

Теперь у меня есть протобафф:

message UserPreferences {
  int64 unix_time_last_update = 5;
}

Мой код:

extensible_user_data = session.query(UserExtensibleData).filter(UserExtensibleData.user_id == user_id).first()
        byte_array = user_preferences.SerializeToString()
        session.add(extensible_user_data)
        extensible_user_data.user_preference_blob = byte_array
        extensible_user_data.unix_timestamp_last_update_seconds = self.datetime_processor.get_utc_timestamp_now()
        session.commit()
        return user_preferences

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

return session.query(UserExtensibleData).filter(UserExtensibleData.user_id == user_id).first()

Генерирует ошибку:

Error closing cursor
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9a in position 3: invalid start byte

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
    context)
  File "/usr/local/lib/python3.5/dist-packages/sqlalchemy/engine/default.py", line 507, in do_execute
    cursor.execute(statement, parameters)
  File "/usr/local/lib/python3.5/dist-packages/mysql/connector/cursor_cext.py", line 272, in execute
    self._handle_result(result)
  File "/usr/local/lib/python3.5/dist-packages/mysql/connector/cursor_cext.py", line 163, in _handle_result
    self._handle_resultset()
  File "/usr/local/lib/python3.5/dist-packages/mysql/connector/cursor_cext.py", line 651, in _handle_resultset
    self._rows = self._cnx.get_rows()[0]
  File "/usr/local/lib/python3.5/dist-packages/mysql/connector/connection_cext.py", line 276, in get_rows
    row = self._cmysql.fetch_row()
SystemError: <built-in method fetch_row of _mysql_connector.MySQL object at 0x3a1bce0> returned a result with an error set

Что меня смущает, так это то, почему он пытается декодировать в первую очередь ... кажется, что я просто пишу байты, а SqlAlchemy должен просто читать байты. Кто-нибудь знает, в чем может быть проблема?

...