2015-03-22 12 views
9

Po raz pierwszy na stronie, więc cześć wszystkim i dziękuję z góry. Długoletni czający i nowicjusz.Flask-Sqlalchemy + Sqlalchemy-searchable powracająca pusta lista

Pracuję nad aplikacją internetową w kolbie, używając Flask-SqlAlchemy i SqlAlchemy-Searchable (docs->https://sqlalchemy-searchable.readthedocs.org/en/latest/index.html). Z jakiegoś powodu nie mogę dowiedzieć się, kiedy próbuję się podobny przykład z kodem podanym na stronie docs:

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy, BaseQuery 
from sqlalchemy_searchable import SearchQueryMixin 
from sqlalchemy_utils.types import TSVectorType 
from sqlalchemy_searchable import make_searchable 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://usr:[email protected]/dev' 
app.config['SECRET_KEY'] = 'notreallyasecret' 
db = SQLAlchemy(app) 
make_searchable() 


class ArticleQuery(BaseQuery, SearchQueryMixin): 
    pass 


class Article(db.Model): 
    query_class = ArticleQuery 
    __tablename__ = 'article' 

    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.Unicode(255)) 
    content = db.Column(db.UnicodeText) 
    search_vector = db.Column(TSVectorType('name', 'content')) 

Moi zapytań nie działają prawidłowo. Otworzyłem powłokę Pythona i utworzyłem bazę danych, a następnie wstawiłem pięć identycznych artykułów o nazwie "finlandia" zarówno jako nazwę, jak i treść. Zgodnie z przykładem:

Article.query.search(u'finland').limit(5).all() 

Powinny być zwrócone artykuły, które mają gdzieś finland. W moim przypadku otrzymuję pustą listę. Otrzymuję obiekt z powrotem, jeśli zmienię przykładowe zapytanie na:

Article.query.search(' ').first() 

Ale raczej bezużyteczne jest poszukiwanie pustych miejsc. Jakieś pomysły?

Dodając nieco więcej: zauważyłem w tabeli artykułów, kolumna "search_vector tsvector" jest całkowicie pusta, mimo że dane znajdują się w kolumnach zawartości i nazwy; Nie jestem pewien, czy to ma coś z tym wspólnego.

+0

Nienawidzę zadać oczywiste pytanie ... ale czy jesteś pewien, że to "Finlandia" w danych? Wydaje mi się, że w wyszukiwaniu sqlalchemy rozróżniana jest wielkość liter ... może twoje dane mają "Finlandię", ale nie "Finlandię"? – dylrei

+0

Prawidłowo poprawne pytanie. Tak, jestem pewien, że są takie same. Zrobiłem kilka więcej nagrań, a ich nazwa i treść to "ciasto". Edytowałem oryginał, aby zrobić finland we wszystkich małych literach. – Vyndion

+0

Wygląda na to, że nie powinieneś niczego odzyskiwać szukając spacji. Czy odzyskasz 5 "finlandzkich" rekordów, które wprowadziłeś, wykonując 'Article.query.search ('') .all()'? – dylrei

Odpowiedz

8

Po raz pierwszy pojawiłem się w tym samym wydaniu, gdy używam Flask-Script, aby dodać do mojego wniosku narzędzie do zarządzania manage.py.

Fakt, że kolumna search_vector jest pusta pomimo dodania odpowiednich parametrów TSVectorType oznacza, że ​​wyzwalacz SQLAlchemy-Searchable nie występuje w DB postgres. Możesz sprawdzić jego brak, wykonując narzędzie wiersza poleceń \df+ w psql - nie zobaczysz wyzwalacza o nazwie article_search_vector_update. Narzędzie SQLAlchemy-Searchable ustawia ten wyzwalacz, aby zaktualizować zawartość kolumny search_vector, zmieniając kolumny o nazwach TSVectorType(...).

W przypadku manage.py, miałem do pierwszego połączenia:

db.configure_mappers() 

Zasadniczo trzeba skonfigurować mappers sqlalchemy za przed wzywające create_all(). Bez tego SQLAlchemy-Searchable nie będzie miał możliwości dodania swojego wyzwalacza search_vector, aby zapełnić kolumnę TSVectorType. Więcej informacji na ten temat można uzyskać na stronie SQLAlchemy-Searchable docs.

W sumie minimalna manage.py że prawidłowo konfiguruje SQLAlchemy-Przeszukiwalny jak wymagać może wyglądać następująco:

#!/usr/bin/env python 

from flask.ext.script import Manager 
from app import app, db 

manager = Manager(app) 

@manager.command 
def init_db(): 
    """ 
    Drops and re-creates the SQL schema 
    """ 
    db.drop_all() 
    db.configure_mappers() 
    db.create_all() 
    db.session.commit() 
6

na odpowiedź Collina Allena: faktycznie, kolbę-sqlalchemy „” db „” naraża funkcję configure_mappers .

Wymienić:

from sqlalchemy.orm.mapper import configure_mappers 
... 
configure_mappers() 

z:

... 
db.configure_mappers() 
+0

Rzeczywiście, działa to świetnie! Zmieniłem moją odpowiedź, by odzwierciedlić twoją notatkę. Dzięki! –

Powiązane problemy