【发布时间】:2017-09-19 20:56:38
【问题描述】:
我正在使用 postgres/SQLAlchemy/Flask-Admin 开发 Flask 应用程序。但是,在管理界面中,由于unicode(exc) 引发了UnicodeDecodeError,因此无法报告任何包含 Unicode 字母的 DB 错误。
我能够将问题定位到sqlalchemy.exc
class StatementError(SQLAlchemyError):
...
def __unicode__(self):
return self.__str__()
并通过以下方式重现问题:
class A(Base):
__tablename__="a"
id = Column(Integer, primary_key=True)
name = Column(String)
name2 = Column(String, nullable=False)
session = Session()
a = A(name=u"עברית")
session.add(a)
try:
session.commit()
except Exception as e:
print(repr(e))
print("------------------")
print(unicode(e))
返回:
ProgrammingError('(psycopg2.ProgrammingError) column "name" of relation "a" does not exist\nLINE 1: INSERT INTO a (name, name2) VALUES (\'\xd7\xa2\xd7\x91\xd7\xa8\xd7\x99\xd7\xaa\', NULL) RETURNING...\n ^\n',)
------------------
Traceback (most recent call last):
File "test.py", line 27, in <module>
print(unicode(e))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 118: ordinal not in range(128)
我目前通过用从utf-8 解码的类替换相关异常来解决它。然而,这是一个可怕的 hack,我正在寻找一个合适的解决方案:
- 有没有办法将 SQLAlchemy 配置为自动解码收到的错误消息?
- 有没有办法配置 Postgres 以
latin编码输出消息(不太受欢迎,但可以接受) - 有没有办法让
unicode尝试通过utf-8而不是ascii/latin解码? - 有什么办法可以解决吗???
(该问题仅与 Python2 有关。在 Python3 中,上面的代码有效。我相信这是因为默认编码是 utf-8)
【问题讨论】:
-
我认为这是 SQLAlchemy tbh 中的一个错误,
__str__应该返回一个str,__unicode__应该返回一个unicode。您应该将此作为问题提交。您可以通过在任何地方使用print(str(e).decode("utf-8"))来解决它,这很乏味,但不是世界上最糟糕的事情。 -
我会将此作为问题提交。但我无法按照建议修复它,因为相关代码在 Flask-Admin 中。我需要一个更全球化的解决方案。
-
@tmrlvi 您能否在此处发布您提交的问题的链接?
标签: postgresql unicode sqlalchemy python-2.x