簡體   English   中英

SQLAlchemy顯示UnicodeWarning:Unicode相等比較失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM