У меня есть следующее определение таблицы:
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 должен просто читать байты. Кто-нибудь знает, в чем может быть проблема?