第一次访问网站,所以大家好,并提前感谢。长期潜伏者和新手。
我正在使用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'列完全为空;我不确定这与它有什么关系。
答案 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()