首页 > 解决方案 > 使用 SqlAlchemy 从 Mysql db 获取二进制数据时出现错误

问题描述

我遇到了问题。在这里,我的 SqlAlchemy 中有这个模型

class ConfigArchive(Base):
    __tablename__ = 'config_archives'

    cluster_id = Column(String(SIZE_TEXT),
                        ForeignKey('clusters.cluster_id'),
                        primary_key=True,
                        index=True,
                        unique=True,
                        nullable=False)
    config_blob = Column(Binary,
                         nullable=False)

然后我使用以下过滤器获取我的二进制数据:

config_archive = self.session.query(ConfigArchive) \
            .filter(ConfigArchive.cluster_id == cluster_id).one_or_none()

在这里我遇到了一个错误,例如:

File ".venv/lib/python2.7/site-packages/sqlalchemy/orm/query.py",line 2924, in one_or_none
     ret = list(self)
File ".venv/lib/python2.7/site-packages/sqlalchemy/orm/query.py",line 2995, in __iter__
     return self._execute_and_instances(context)
File ".venv/lib/python2.7/site-packages/sqlalchemy/orm/query.py",line 3018, in _execute_and_instances
     result = conn.execute(querycontext.statement, self._params) 
File ".venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py",line 948, in execute
     return meth(self, multiparams, params)
File ".venv/lib/python2.7/site-packages/sqlalchemy/sql/elements.py",line 269, in _execute_on_connection
     return connection._execute_clauseelement(self, multiparams, params)
File ".venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1060, in _execute_clauseelement
     compiled_sql, distilled_params
File ".venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1200, in _execute_context
     context)
File ".venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py",line 1416, in _handle_dbapi_exception
     util.reraise(*exc_info)
File ".venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
     context)
File ".venv/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 509, in do_execute
     cursor.execute(statement, parameters)
File ".venv/lib/python2.7/site-packages/mysql/connector/cursor_cext.py", line 272, in execute
     self._handle_result(result)
File ".venv/lib/python2.7/site-packages/mysql/connector/cursor_cext.py", line 163, in _handle_result
     self._handle_resultset()
File ".venv/lib/python2.7/site-packages/mysql/connector/cursor_cext.py", line 651, in _handle_resultset
     self._rows = self._cnx.get_rows()[0]
File ".venv/lib/python2.7/site-packages/mysql/connector/connection_cext.py", line 288, in get_rows
     _eof = self.fetch_eof_columns()['eof']
File ".venv/lib/python2.7/site-packages/mysql/connector/connection_cext.py", line 349, in fetch_eof_columns
     for col in fields:
File ".venv/lib/python2.7/encodings/utf_8.py", line 16, in decode
     return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: 'utf8' codec can't decode byte 0x8b in position 1:
 invalid start byte

我尝试解码我​​的数据并重新编码为 utf-8,但它不起作用。我还为 DB 设置了 charset=utf8 ,但它帮不了我

我不知道怎么说 SQLAlchemy 通过“latin-1”编码来解码我的二进制数据。因为,我认为,它有效,因为我在 debagging python 的内部源时尝试了这个

lib/python2.7/encodings/utf_8.py 并成功解码了我的二进制数据

所以,请,如果有人对此有所了解,请提出您的想法。谢谢

标签: pythonmysqlpython-2.7sqlalchemy

解决方案


推荐阅读