2015-06-17 13 views
5

Đây là chỉ mục tạo mã hiện tại cho JSONB.Làm thế nào để tạo chỉ mục jsonb sử dụng GIN trên SQLAlchemy?

Index("mytable_data_idx_id_key", Mytable.data['id'].astext, postgresql_using='gin') 

Nhưng tôi gặp lỗi này.

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) data type text has no default operator class for access method "gin" 
HINT: You must specify an operator class for the index or define a default operator class for the data type. 
[SQL: "CREATE INDEX event_data_idx_id_key ON event USING gin ((data ->> 'id'))"] 

Có cách nào để tạo chỉ mục trên SQLAlchemy?

Trả lời

1

Các PostgreSQL docs SQLAlchemy cụ thể tại http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#operator-classes đề cập đến một cuốn từ điển postgresql_ops để cung cấp các "lớp toán tử" được sử dụng bởi PostgreSQL, và cung cấp ví dụ minh họa việc sử dụng nó:

Index('my_index', my_table.c.id, my_table.c.data, 
         postgresql_ops={ 
          'data': 'text_pattern_ops', 
          'id': 'int4_ops' 
         }) 

Từ thử nghiệm, có vẻ như bạn cần sử dụng mô tả chỉ mục text() nếu bạn muốn chỉ định "toán tử lớp" cho chỉ mục biểu thức. Vì vậy,

db.Index(
    'ix_sample', 
    sqlalchemy.text("(jsoncol->'values') jsonb_path_ops"), 
    postgresql_using="gin") 

... trong __table_args__ cho một mô hình ORM xác định một chỉ số GIN trên một sân jsonb có chứa một mảng các chuỗi, và cho phép tra cứu hiệu quả, tức là phù hợp vào bất kỳ chuỗi trong JSON lĩnh vực mảng trông như thế này:

{ 
    "values": ["first", "second", "third"], 
    "other": "fields", 
    "go": "here" 
} 

Truy vấn sử dụng @> nhà điều hành trong PostgreSQL sẽ giống như thế này:

import sqlalchemy 
from sqlalchemy.dialects import postgresql 

query = session.query(MyModel).filter(
    sqlalchemy.type_coerce(MyModel.jsoncol['values'], postgresql.JSONB) 
    .contains(sqlalchemy.type_coerce("second", postgresql.JSONB))) 
results = query.all() 
+0

tôi Trie d nhưng tôi có lỗi. 'sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) toán tử lớp" text_pattern_ops "không chấp nhận kiểu dữ liệu jsonb' –

+0

tôi đã cập nhật câu trả lời của mình với nhiều ví dụ hơn –

Các vấn đề liên quan