Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 炼金术+;Sqlalchemy可搜索返回空列表_Python_Search_Flask_Sqlalchemy - Fatal编程技术网

Python 炼金术+;Sqlalchemy可搜索返回空列表

Python 炼金术+;Sqlalchemy可搜索返回空列表,python,search,flask,sqlalchemy,Python,Search,Flask,Sqlalchemy,第一次在网站上,所以大家好,提前感谢。长期潜伏者和新手 我正在flask中开发一个web应用程序,使用flask SqlAlchemy和SqlAlchemy Searchable(docs->)。出于某种原因,当我尝试与文档页面上显示的代码类似的示例时,我无法理解: from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy, BaseQuery from sqlalchemy_searchable import Sea

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

我正在flask中开发一个web应用程序,使用flask SqlAlchemy和SqlAlchemy Searchable(docs->)。出于某种原因,当我尝试与文档页面上显示的代码类似的示例时,我无法理解:

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
名称和内容均为“芬兰”。根据示例:

Article.query.search(u'finland').limit(5).all()
应该有一些归还的物品里面有芬兰。在我的情况下,我得到一个空列表。如果将示例查询修改为:

Article.query.search(' ').first()
但是搜索空的空间是毫无用处的。有什么想法吗


再加一点:我注意到在文章表中,“search_vector tsvector”列完全为空,尽管数据位于content和name列中;我不确定这是否与此有关。

在使用向我的应用程序添加
manage.py
管理工具时,我也遇到过同样的问题

尽管添加了相应的
TSVectorType
参数,
search\u vector
列仍然为空,这意味着postgres DB中不存在SQLAlchemy可搜索触发器。您可以通过在
psql
命令行工具中执行
\df+
来验证它是否存在——您将不会看到名为
文章搜索向量更新的触发器。SQLAlchemy Searchable设置此触发器,以在
TSVectorType(…)
中命名的列发生更改时更新
search\u vector
列的内容

对于
manage.py
,我必须首先调用:

db.configure_mappers()
本质上,您必须在调用
create\u all()
之前配置SQLAlchemy的映射器。如果不这样做,SQLAlchemy Searchable将没有机会添加其
search\u向量
触发器来填充模型中的
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的回答:实际上,Alchemy“db”公开了configure_mappers函数

替换:

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


我讨厌问一个明显的问题。。。但你确定你的数据中有“芬兰”吗?我相信sqlalchemy搜索是区分大小写的。。。也许你的数据有一个“芬兰”,但没有“芬兰”?完全正确的问题。是的,我肯定他们是一样的。实际上,我制作了更多的唱片,名字和内容都是“馅饼”。我编辑了原稿,使芬兰的所有小写。似乎你不应该得到任何东西回来搜索空间。如果执行
Article.query.search(“”).all()
,您是否会返回您输入的5条“finland”记录?我想我有点不对劲,它不一定是在搜索空格,只是当Article.query.search(“”).all()返回所有五个对象的列表时。为清楚起见(它在一个名为uploadform的py文件中):[,]你抓救命稻草的方法似乎是正确的。我用unicode值重新实例化了记录,现在搜索查询开始工作了。我想知道它们是否都必须是unicode值,或者Sqlalchemy searchable是否只能搜索unicode值。我是在假定python3字符串默认为unicode的情况下操作的。我想这需要更多的测试。谢谢事实上,这非常有效!我编辑了我的答案以反映你的笔记。谢谢
...
db.configure_mappers()