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.