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()
第一次访问该站点,大家好,在此先致谢。长期潜伏者和新手。
我正在使用 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()