Запрос не имеет атрибута whoosh_search AttributeError в Flask + Whoosh + SQLAlchemy

У меня есть странная проблема с Flask-WhooshAlchemy, а также с Flask-Whooshee, которая напоминает следующие проблемы:

Я начал с Flask-WhooshAlchemy. Я знаю, что Whoosh работает только с недавно проиндексированными элементами, а не с уже существующими, поэтому я повторно импортировал все в свою базу данных. Это не сработало, поэтому я выполнил основной код из этого вопроса Stackoverflow: Как данные индекса flask-whooshalchemy импортированы вручную?.

Я сделал одно небольшое изменение в его коде. Поскольку model.query у меня не работал (я предполагаю, что стиль создания запросов устарел, но это всего лишь догадки), я подключил движок и назвал его таким образом. В любом случае это сработало, и я создал индекс Whoosh нормального размера.

Я сделал шаг, поместив это в конец моего файла schema.py (некоторые называют его models.py):

whooshalchemy.whoosh_index(app, Restaurant)

и я добавляю список элементов, доступных для поиска, внутри определения класса. Я также нашел эту ссылку, описывающую некоторые недостатки перегрузки «запроса», как это сделал разработчик: http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xvi-debugging-testing-and-profiling/page /3. Он написал код, исправляющий ошибку — https://raw.githubusercontent.com/miguelgrinberg/Flask-WhooshAlchemy/1e17350ea600e247c0094cfa4ae7145f08f4c4a3/flask_whooshalchemy.py — и я тоже пытался установить это, но вернулся, когда это не помогло.

Вот трассировка:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/<omitted>/App/api/app/views.py", line 96, in instant
    result = q.whoosh_search(query).all()
AttributeError: 'Query' object has no attribute 'whoosh_search'

Я попробовал это с помощью Flask-Whooshie, который выглядел очень, очень похоже, и я получаю ту же ошибку.

Вот рассматриваемый код (после перехода на Flask-Whooshee, но я оставил код Flask-WhooshAlchemy закомментированным):

просмотров.py:

@app.route('/search')
def search():

    query = request.args.get('query', '', type=str)
    q = session.query()
    result = q.whooshee_search(query).all()
    #result = q.whoosh_search(query).all()

    return Response(json.dumps(result), mimetype='text/json')

схема.py:

from app import app
from flask.ext.whooshee import Whooshee
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, Float, String, Date
# import flask.ext.whooshalchemy as whooshalchemy

from settings import WHOOSH_BASE

Base = declarative_base()
whooshee = Whooshee(app)
@whooshee.register_model('db_name', 'db_addr', 'google_name', 'yelp_name',
        'yelp_address')
class Restaurant(Base):
    __tablename__ = 'restaurant_indexed'
    #__searchable__ = ['db_name', 'db_addr', 
    #        'google_name', 'yelp_name', 'yelp_address']
    restaurant_id = Column(Integer, primary_key=True)
    google_id = Column(String)
    db_name = Column(String)
    db_addr = Column(String)

# whooshalchemy.whoosh_index(app, Restaurant)

Я закомментировал строки, которые ранее использовались в версии кода Flask-WhooshAlchemy.

Мой init.py выглядит так:

from flask import Flask
app = Flask(__name__)
app.config['WHOOSH_BASE'] = '/home/me/path/to/whoosh/dir'
from app import views

person szxk    schedule 03.07.2014    source источник
comment
Вам когда-нибудь удавалось найти решение?   -  person Battleroid    schedule 31.01.2015


Ответы (2)


Я получал ту же ошибку, а затем, когда я перечитал документы, я заметил, что создание сообщения — это один из шагов к возможности whoosh_search:

Например, таблицу необходимо сначала проиндексировать whoosh (docs):

Let’s create a post:

db.session.add(
    BlogPost(title='My cool title', content='This is the first post.')
); db.session.commit()

После фиксации сеанса наш новый BlogPost индексируется. Точно так же, если сообщение будет удалено, оно будет удалено из индекса Whoosh.

Есть ли способ добавить существующий db.table в индекс whoosh? Одним из решений является повторная вставка всех строк; этот post, кажется, дает указания, но также утверждает, что whooshalchemy не поддерживается.

person Chet Meinzer    schedule 06.09.2016

Я всегда просто использовал Flask-SQLAlchemy, но не напрямую SQLAlchemy.

С Flask-SQLAlchemy я бы запросил таблицу Restaurant следующим образом:

  Restaurant.query.whoosh_search('foo')

Судя по документам SQLAlchemy, вам нужно что-то сделать как это:

  q = session.query(Restaurant)
  result = q.whooshee_search(query).all()
person finnurtorfa    schedule 12.07.2014
comment
Привет, finnurtorfa, как вы можете видеть на моем примере (views.py), именно этим я и занимаюсь. Спасибо, что указали мне на Flask-SQLAlchemy, хотя я не осознавал, что синтаксис отличается, и поэтому я был сбит с толку различными типами синтаксиса, которые люди используют в примерах. - person szxk; 13.07.2014
comment
На самом деле между моим примером и вашим есть небольшая разница. q = session.query(Ресторан) против q = session.query(). Но я не уверен, что это решит ваши проблемы, хотя - person finnurtorfa; 13.07.2014