[英]SQLAlchemy showing a UnicodeWarning: Unicode equal comparison failed
我從Google AppEngine中收到以下錯誤,但是我沒有任何堆棧跟蹤信息,也沒有更多詳細信息來找到問題的根源,我希望有人能對這種情況有更多的了解以幫助我:
/base/data/home/apps/s~myproject-prod/20170207t172637.399025232647613201/lib/sqlalchemy/sql/type_api.py:359:Unicode警告:Unicode相等比較無法將兩個參數都轉換為Unicode-將它們解釋為不相等
返回x == y
這是代碼的來源:
data = request.get_json()
client_email = clean_str(data.get('email', None))
client = Client.query.filter(Client.email == client_email)
if client is None:
client = Client(data)
else:
client.update(data)
client.save() # ERROR IS THROWN HERE
# I was able to trace it here by logging some text before/after the error.
和模型:
class Client(db.Model):
__tablename__ = 'clients'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(250), nullable=True, default=None)
email = db.Column(db.String(250), nullable=False, index=True)
details = db.Column(types.JSON(none_as_null=True), default=None)
def __init__(self, client_infos):
self.email = client_infos['email'].lower()
del(client_infos['email'])
self.details = json.dumps(client_infos)
def update(self, data):
# Some treatment of the data, removing some fields, etc
self.details = json.dumps(data)
def save(self, commit=True):
db.session.add(self)
if commit:
db.session.commit()
return self
和clean_str函數:
def clean_str(value):
if not isinstance(value, (str, unicode)):
return value
try:
value = unicode(value, 'utf-8', errors='ignore')
except:
pass
try:
value = value.encode('utf-8')
except:
pass
return value
有人知道我為什么會收到該錯誤嗎? 是因為types.JSON
嗎?
我尚未對此進行測試,但是似乎問題是您正在嘗試將Client.email(它是一個字符串)與用戶輸入進行比較,該用戶輸入將在clean_str函數中轉換為unicode。
一種可能的解決方案是將用戶輸入轉換為Python字符串而不是unicode。 但是如果出於某種原因您需要輸入為unicode,則可能會導致問題。
我推薦的另一個解決方案是使用SQLAlchemy將String類型轉換為unicode。 您需要將模型修改為:
email = db.Column(db.String(250), nullable=False, index=True, convert_unicode=True)
這基本上將告訴SQLAlchemy將數據庫返回的值轉換為unicode。 您可以在此處了解更多信息: http : //docs.sqlalchemy.org/en/latest/core/type_basics.html#sqlalchemy.types.String.params.convert_unicode
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.