2017-02-22 39 views
2

Мне нужно создать индекс полного текста PostgreSQL в Python с SQLAlchemy. Вот что я хочу в SQL:Создать индекс полного текста с SQLAlchemy на PostgreSQL

CREATE TABLE person (id INTEGER PRIMARY KEY, name TEXT); 
CREATE INDEX person_idx ON person USING GIN (to_tsvector('simple', name)); 

Теперь, как я делаю вторую часть с SQLAlchemy при использовании ORM:

class Person(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String) 

ответ

5

Вы можете создать индекс с помощью Index в __table_args__. Также я использую функцию для создания ts_vector, чтобы сделать ее более аккуратной и многоразовой, если требуется более одного поля. Что-то, как показано ниже:

from sqlalchemy.dialects import postgresql 

def create_tsvector(*args): 
    exp = args[0] 
    for e in args[1:]: 
     exp += ' ' + e 
    return func.to_tsvector('english', exp) 

class Person(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String) 

    __ts_vector__ = create_tsvector(
     cast(func.coalesce(name, ''), postgresql.TEXT) 
    ) 

    __table_args__ = (
     Index(
      'idx_person_fts', 
      __ts_vector__, 
      postgresql_using='gin' 
     ) 
    ) 

Update: Пример запроса с использованием индекса:

query = Person.__ts_vector__.match(expressions, postgresql_regconfig='english') 
people = query.all() 
+1

Благодаря спариванию, это прекрасно работает! :) –

+0

Не могли бы вы привести пример того, как запросить вектор? Благодарю. –

+0

@JakobKristensen Я обновил ответ. – Sharez