Flask-Sqlalchemy + Sqlalchemy-searchable返回空列表

时间:2015-03-22 18:56:27

标签: python search flask sqlalchemy

第一次访问网站,所以大家好,并提前感谢。长期潜伏者和新手。

我正在使用Flask-SqlAlchemy和SqlAlchemy-Searchable(docs-> https://sqlalchemy-searchable.readthedocs.org/en/latest/index.html)处理烧瓶中的Web应用程序。出于某种原因,我无法弄清楚,当我在文档页面上显示的代码中尝试类似的示例时:

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:admin@localhost/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'))

我的搜索查询无法正常运行。我打开了一个python shell并创建了db,并插入了五篇相同的文章

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

以'finland'作为名称和内容。根据例子:

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

应该有返回的文章在其中的某处有芬兰。就我而言,我得到一个空列表。如果我将示例查询修改为:

,我会得到一个对象
Article.query.search(' ').first()

但是搜索空白空间相当无用。有什么想法吗?

添加更多内容:我注意到在文章表中,尽管数据位于内容和名称列中,但'search_vector tsvector'列完全为空;我不确定这与它有什么关系。

2 个答案:

答案 0 :(得分:8)

在使用Flask-Script向我的应用程序添加manage.py管理工具时,我也曾遇到过这个问题。

尽管添加了适当的search_vector参数,但TSVectorType列为空,这意味着在postgres DB中不存在SQLAlchemy-Searchable触发器。您可以通过在\df+命令行工具中执行psql来验证其缺席情况 - 您将看不到名为article_search_vector_update的触发器。 SQLAlchemy-Searchable设置此触发器,以便在search_vector中命名的列发生更改时更新TSVectorType(...)列的内容。

manage.py的情况下,我必须先致电:

db.configure_mappers()

基本上,您必须在调用create_all()之前配置SQLAlchemy的映射器。如果不这样做,SQLAlchemy-Searchable将无法添加其search_vector触发器来填充模型中的TSVectorType列。SQLAlchemy-Searchable docs有更多内容。

总的来说,根据需要正确配置SQLAlchemy-Searchable的最小manage.py可能如下所示:

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

答案 1 :(得分:6)

关于Collin Allen的回答:实际上,烧瓶 - sqlalchemy' db''''公开configure_mappers函数。

替换:

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

使用:

...
db.configure_mappers()