PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Dữ liệu đối sánh văn bản SQLAlchemy bên trong trường JSON với UTF-8

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chú thích ngủ đông - UniqueConstraint không phân biệt chữ hoa chữ thường

  2. GROUP BY trong Postgres - không bình đẳng cho kiểu dữ liệu JSON?

  3. Cập nhật truy vấn quá chậm trên Postgres 9.1

  4. Bảng tổng hợp cho dữ liệu mỗi giờ

  5. Postgres:CHÈN nếu chưa tồn tại