AtrributeError "Запрос не имеет атрибута" whoosh_search во Flask + Whoosh + SQLAlchemy
У меня есть странная проблема с Flask-WhooshAlchemy, а также Flask-Whooshee, которая напоминает эти проблемы:
- https://github.com/gyllstromk/Flask-WhooshAlchemy/issues/13
- https://github.com/miguelgrinberg/flasky/issues/8
Я начал с Flask-WhooshAlchemy. Я знаю, что Whoosh работает только с недавно проиндексированными элементами, а не с уже существующими, поэтому я снова импортировал все в свою базу данных. Это не сработало, поэтому я запустил суть кода из этого вопроса Stackru: как вручную импортировать данные индекса колбы-свихальхимии?,
Я сделал одно небольшое изменение в его коде. Поскольку 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-Whooshee, которое выглядело очень, очень похоже, и я получаю ту же ошибку.
Вот этот код (после переключения на Flask-Whooshee, но я оставил закомментированный код Flask-WhooshAlchemy):
views.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')
schema.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
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? Одним из решений является повторная вставка всех строк; этот пост, кажется, дает указания, но также утверждает, что whooshalchemy не поддерживается.
Я всегда только использовал Flask-SQLAlchemy, но не SQLAlchemy напрямую.
С Flask-SQLAlchemy я бы запросил таблицу Restaurant следующим образом:
Restaurant.query.whoosh_search('foo')
Из документации по SQLAlchemy похоже, что вам нужно сделать что-то вроде этого:
q = session.query(Restaurant)
result = q.whooshee_search(query).all()