PostgreSQL docs specyficzny sqlalchemy w http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#operator-classes wspomnieć słownika postgresql_ops
aby zapewnić „klasę operatora” używany przez PostgreSQL i zapewnić ten przykład ilustrujący jego zastosowanie:
Index('my_index', my_table.c.id, my_table.c.data,
postgresql_ops={
'data': 'text_pattern_ops',
'id': 'int4_ops'
})
Od eksperymentowania, wydaje się, że trzeba użyj opisu indeksu text()
, jeśli chcesz określić "klasę operatorów" dla indeksu wyrażeń. Więc
db.Index(
'ix_sample',
sqlalchemy.text("(jsoncol->'values') jsonb_path_ops"),
postgresql_using="gin")
... w __table_args__
dla modelu ORM określa indeks GIN na jsonb
pola zawierającego tablicę ciągów, a to pozwala na efektywne wyszukiwań, czyli pasujące na każdy z ciągów w JSON pole tablica, która wygląda tak:
{
"values": ["first", "second", "third"],
"other": "fields",
"go": "here"
}
Zapytania za pomocą operatora w PostgreSQL @>
będzie wyglądać mniej więcej tak:
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()
I TRIE d ale mam błąd. 'sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) klasa operatora" text_pattern_ops "nie akceptuje typu danych jsonb' –
zaktualizowałem swoją odpowiedź, podając więcej przykładów –