2015-03-22 2 views
9

Первый раз на сайте, так что привет всем и спасибо заранее. Долгосрочный lurker и newb.Flask-Sqlalchemy + Sqlalchemy-searchable возвращающийся пустой список

Я работаю над веб-приложением в колбе, используя Flask-SqlAlchemy и SqlAlchemy-Searchable (docs->https://sqlalchemy-searchable.readthedocs.org/en/latest/index.html). По причине я не могу понять, когда я пытаюсь примером похож на код, указанный на странице Документов

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

Мои поисковые запросы не работают должным образом. Я открыл питона оболочки и создал децибел, и вставил пять одинаковых статей

a= Article(name='finland',content='finland') 
db.session.add(a) 
db.session.commit() #a-e 

с «финляндии» и как имя и содержание. В соответствии с примером:

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

Должны быть возвращены предметы, в которых есть финляндия. В моем случае я получаю пустой список. Я возвращаю объект обратно, если я изменю запрос к примеру:

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

Но это бесполезный поиск пустых пространств. Есть идеи?

Добавление немного больше к нему: в таблице статей я заметил, что столбец «search_vector tsvector» полностью пуст, несмотря на то, что данные находятся в столбцах содержимого и имени; Я не уверен, что это связано с этим.

+0

Ненавижу задать очевидный вопрос ... но вы уверены, что есть "финляндия" в ваших данных? Я считаю, что поиск sqlalchemy чувствителен к регистру ... возможно, ваши данные имеют «Финляндию», но нет «финляндии»? – dylrei

+0

Полностью действующий вопрос. Да, я уверен, что они одинаковы. Я на самом деле собрал больше записей, а имя и контент были «пирогом». Я отредактировал оригинал, чтобы сделать finland во всех нижних регистрах. – Vyndion

+0

Кажется, вам не нужно ничего искать в поисках пробелов. Получаете ли вы записи 5 «финляндий», которые вы ввели, если вы делаете «Article.query.search ('') .all()'? – dylrei

ответ

8

Я также столкнулся с этим вопросом, когда я использовал Flask-Script, чтобы добавить в приложение приложение manage.py.

Тот факт, что столбец search_vector пуст, несмотря на то, что вы добавили соответствующие параметры TSVectorType, означает, что триггер SQLAlchemy-Searchable отсутствует в базе данных postgres. Вы можете проверить его отсутствие, выполнив команду \df+ в инструменте командной строки psql - вы не увидите триггер с именем article_search_vector_update. SQLAlchemy-Searchable устанавливает этот триггер для обновления содержимого столбца search_vector при изменении столбцов, названных в TSVectorType(...).

В случае manage.py, я должен был первый звонок:

db.configure_mappers() 

По существу, вы должны настроить картографами SQLAlchemy в перед тем призывающих create_all(). Без этого SQLAlchemy-Searchable не будет предоставлена ​​возможность добавить триггер search_vector, чтобы заполнить столбец TSVectorType в модели. У SQLAlchemy-Searchable docs есть больше об этом.

В общей сложности, минимальный manage.py что правильно настраивает SQLAlchemy-Searchable как вы требуете может выглядеть следующим образом:

#!/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

На ответ Колина Аллена: на самом деле, колба-SQLAlchemy «» дб «» предоставляет функцию configure_mappers ,

Заменить:

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

с:

... 
db.configure_mappers() 
+0

Действительно, это отлично работает! Я отредактировал свой ответ, чтобы отразить ваше примечание. Благодаря! –

Смежные вопросы