2015-06-17 84 views
5

以下是JSONB的當前代碼創建索引。如何在SQLAlchemy上使用GIN創建jsonb索引?

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

但我得到了這個錯誤。

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'))"] 

有沒有什麼辦法可以在SQLAlchemy上創建索引?

回答

1

PostgreSQL的在http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#operator-classes具體SQLAlchemy的文檔提到一個postgresql_ops字典提供PostgreSQL所使用的「操作符表」,並提供這個例子說明它的用途:

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

從試驗,看來你需要如果要爲表達式索引指定「操作符類」,請使用text()索引描述。所以,

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

...在__table_args__一個ORM模型規定在包含字符串數組的jsonb領域的GIN索引,並且,可實現有效的查找,即匹配任何字符串中的JSON陣列場,看起來像這樣:

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

使用PostgreSQL中@>運營商將是這個樣子查詢:

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

我TRIE但我得到錯誤。 'sqlalchemy.exc.ProgrammingError:(psycopg2.ProgrammingError)運算符類「text_pattern_ops」不接受數據類型jsonb' –

+0

我更新了我的答案,更多示例 –

相關問題