我正在使用postgres/SQLAlchemy/Flask-Admin處理Flask應用程序。但是,在Admin界面中,由於unicode(exc)
會產生UnicodeDecodeError
,因此無法報告包含Unicode字母的任何數據庫錯誤。SQLAlchemy在異常中的Unicode問題
我能夠一起找到問題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)
我目前解決這個問題用我的從解碼的類取代相關的例外。但是,這是一個可怕的黑客,我正在尋找一個適當的解決方案:
- 有沒有辦法配置SQLAlchemy自動解碼接收到的錯誤消息?
- 有沒有辦法在
latin
編碼(不太有利,但accetable) - 有沒有辦法讓
unicode
嘗試utf-8
,而不是ascii
/latin
解碼配置Postgres的輸出信息? - 有什麼辦法可以解決它?
(問題是相關的只有Python2在Python3上述工程的代碼。我相信這是因爲默認的編碼是utf-8
)
我所說的,在SQLAlchemy的TBH一個bug,'__str__'應該返回一個'str'和'__unicode__'應該返回一個'unicode'。您應該將此作爲問題提交。你可以通過在所有地方執行print(str(e).decode(「utf-8」))來解決它,這很乏味,但不是世界上最糟糕的事情。 – univerio
我會將此作爲一個問題。但是我無法按照建議修復它,因爲相關代碼位於Flask-Admin中。我需要一個更全球化的解決方案。 – tmrlvi
@tmrlvi您可以在這裏發帖鏈接到您提交的問題嗎? –