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

Flask-Sqlalchemy + Sqlalchemy-searchable returning empty list

第一次访问该站点,大家好,在此先致谢。长期潜伏者和新手。

我正在使用 Flask-SqlAlchemy 和 SqlAlchemy-Searchable (docs-> https://sqlalchemy-searchable.readthedocs.org/en/latest/index.html) 在 Flask 中开发网络应用程序。出于我无法弄清楚的原因,当我尝试 similar 示例到文档页面上显示的代码时:

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 并创建了数据库,并插入了五篇相同的文章

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

但是搜索空白处是没有用的。有什么想法吗?

再补充一点:我在文章 table 中注意到,尽管内容和名称列中有数据,但 'search_vector tsvector' 列完全是空的;我不确定这是否与它有关。

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

尽管您添加了适当的 TSVectorType 参数,但 search_vector 列为空这一事实意味着 SQLAlchemy-Searchable 触发器不存在于 postgres 数据库中。您可以通过在 psql 命令行工具中执行 \df+ 来验证它是否存在——您不会看到名为 article_search_vector_update 的触发器。 SQLAlchemy-Searchable 设置此触发器以在 TSVectorType(...) 中命名的列更改时更新 search_vector 列的内容。

manage.py的情况下,我不得不先调用:

db.configure_mappers()

本质上,您必须在 调用 create_all() 之前配置 SQLAlchemy 的映射器 。如果不这样做,SQLAlchemy-Searchable 将不会有机会添加其 search_vector 触发器来填充 model.The SQLAlchemy-Searchable docs 中的 TSVectorType 列。

总的来说,根据需要正确配置 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()

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

替换:

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

与:

...
db.configure_mappers()