समस्या cast(Unicode)
में है Postgresql json
. का कॉलम। यह बस json
. को कास्ट करता है SQLAlchemy के Unicode
. में अंतर्निहित टेक्स्ट प्रकार के लिए , Postgresql VARCHAR
. के मामले में . दूसरे शब्दों में यह टेक्स्ट सामग्री निकालने के बजाय JSON का एक स्ट्रिंग प्रतिनिधित्व उत्पन्न करता है। यदि आपका इनपुट यूनिकोड कोडपॉइंट से बच निकला है, तो वे इस मामले में आउटपुट हैं। एक आसान Test
को देखते हुए json
. वाला मॉडल कॉलम डेटा :
In [7]: t = Test(data={'summary': 'Tämä on summary.'})
In [8]: session.add(t)
In [9]: session.commit()
In [11]: session.query(Test.data['summary'].cast(Unicode)).scalar()
Out[11]: '"T\\u00e4m\\u00e4 on summary."'
यह स्पष्ट होना चाहिए कि अनचाहे यूनिकोड वर्णों वाला एक मैच क्यों विफल हो जाएगा। बची हुई यूनिकोड को छोड़कर, टेक्स्ट सामग्री को निकालने का सही तरीका है astext
, जो ->>
का उपयोग करता है ऑपरेटर
पोस्टग्रेस्क्ल में:
In [13]: session.query(Test.data['summary'].astext).scalar()
Out[13]: 'Tämä on summary.'
JSON फ़ंक्शन और ऑपरेटर दस्तावेज़ों का हवाला देते हुए:
तो आपके मामले में:
Message.query.\
filter(Message.content['summary'].astext.match(term))
ध्यान दें कि यह केवल json
. पर लागू होता है टाइप करें, न कि jsonb
, क्योंकि json
प्रकार इनपुट पर यूनिकोड एस्केप को परिवर्तित नहीं करता है। jsonb
दूसरी ओर सभी यूनिकोड एस्केप को बराबर ASCII या UTF-8 में कनवर्ट करता है भंडारण के लिए वर्ण
. अगर हमारा Test
मॉडल में एक दूसरा कॉलम था data2 jsonb
, ठीक उसी इनपुट के साथ, तो परिणाम होगा:
In [11]: session.query(Test.data['summary'].cast(Unicode),
...: Test.data2['summary'].cast(Unicode)).first()
Out[11]: ('"T\\u00e4m\\u00e4 on summary."', '"Tämä on summary"')
फिर भी, आपको astext
. का उपयोग करना चाहिए , यदि आप JSON के स्ट्रिंग प्रस्तुतिकरण के बजाय टेक्स्ट चाहते हैं।