Vyn*_*ion 9 python search sqlalchemy flask
第一次在网站上,所以喜欢所有人,并提前感谢.长期潜伏者和新手.
我正在研究烧瓶中的Web应用程序,使用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: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'))
Run Code Online (Sandbox Code Playgroud)
我的搜索查询无法正常运行.我打开了一个python shell并创建了db,并插入了五篇相同的文章
a= Article(name='finland',content='finland')
db.session.add(a)
db.session.commit() #a-e
Run Code Online (Sandbox Code Playgroud)
以'芬兰'作为名称和内容.根据例子:
Article.query.search(u'finland').limit(5).all()
Run Code Online (Sandbox Code Playgroud)
应该有返回的文章在其中的某个地方有芬兰.就我而言,我得到一个空列表.如果我将示例查询修改为:我得到一个对象:
Article.query.search(' ').first()
Run Code Online (Sandbox Code Playgroud)
但是搜索空白空间相当无用.有任何想法吗?
添加更多内容:我注意到在文章表中,尽管数据位于内容和名称列中,但'search_vector tsvector'列完全为空; 我不确定这与它有什么关系.
当使用Flask-Scriptmanage.py向我的应用程序添加管理工具时,我也曾遇到过这个问题.
search_vector尽管添加了适当的TSVectorType参数,但列为空的事实意味着postgres DB中不存在SQLAlchemy-Searchable触发器.你可以做一个验证其没有\df+在psql命令行工具-你不会看到一个名为触发article_search_vector_update.SQLAlchemy-Searchable设置此触发器search_vector以在TSVectorType(...)更改时命名的列时更新列的内容.
在这种情况下manage.py,我不得不先打电话:
db.configure_mappers()
Run Code Online (Sandbox Code Playgroud)
实质上,您必须在调用之前配置SQLAlchemy的映射器create_all().如果不这样做,SQLAlchemy-Searchable将不会有机会添加其search_vector触发器来填充TSVectorType模型中的列.SQLAlchemy-Searchable文档有更多内容.
总的来说,根据需要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()
Run Code Online (Sandbox Code Playgroud)
关于Collin Allen的回答:实际上,flask-sqlalchemy''db''暴露了configure_mappers函数.
更换:
from sqlalchemy.orm.mapper import configure_mappers
...
configure_mappers()
Run Code Online (Sandbox Code Playgroud)
有:
...
db.configure_mappers()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1698 次 |
| 最近记录: |