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()
Nguồn
2015-08-04 10:53:24
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' –
tôi đã cập nhật câu trả lời của mình với nhiều ví dụ hơn –