Vấn đề nằm ở cast(Unicode) của một Postgresql json cột. Nó chỉ đơn giản là CAST json sang loại văn bản cơ bản Unicode của SQLAlchemy , trong trường hợp của Postgresql VARCHAR . Nói cách khác, nó tạo ra một biểu diễn chuỗi JSON thay vì trích xuất nội dung văn bản. Nếu đầu vào của bạn chứa các điểm mã unicode thoát, chúng sẽ xuất ra như trong trường hợp này. Đưa ra một Test đơn giản mô hình với json cột dữ liệu :
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."'
Rõ ràng là tại sao một kết quả khớp với các ký tự unicode không thoát sẽ không thành công. Cách chính xác để trích xuất nội dung văn bản, không thoát khỏi unicode thoát, là sử dụng astext
, sử dụng ->> nhà điều hành
trong Postgresql:
In [13]: session.query(Test.data['summary'].astext).scalar()
Out[13]: 'Tämä on summary.'
Trích dẫn các hàm JSON và tài liệu toán tử:
Vì vậy, trong trường hợp của bạn:
Message.query.\
filter(Message.content['summary'].astext.match(term))
Lưu ý rằng điều này chỉ áp dụng cho json nhập, không phải jsonb , bởi vì json loại không chuyển đổi thoát unicode trên đầu vào. jsonb mặt khác chuyển đổi tất cả các lần thoát unicode thành ASCII hoặc UTF-8 tương đương ký tự để lưu trữ
. Nếu Test của chúng tôi mô hình chứa một cột thứ hai data2 jsonb , với cùng một đầu vào chính xác, thì kết quả sẽ là:
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"')
Tuy nhiên, bạn nên sử dụng astext , nếu bạn muốn văn bản thay vì biểu diễn chuỗi của JSON.