2015-03-22 25 views
9

Lần đầu tiên trên trang web, vì vậy xin chào tất cả và cảm ơn trước. Lurker lâu năm và newb.Flask-Sqlalchemy + Sqlalchemy-tìm kiếm trở lại danh sách trống

Tôi đang làm việc trên một ứng dụng web trong bình, sử dụng Flask-SqlAlchemy và SqlAlchemy-Searchable (docs->https://sqlalchemy-searchable.readthedocs.org/en/latest/index.html). Đối với một lý do tôi không thể tìm ra, khi tôi thử một ví dụ tương tự vào mã hiển thị trên trang tài liệu:

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:[email protected]/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')) 

truy vấn tìm kiếm của tôi không hoạt động đúng. Tôi đã mở một vỏ trăn và tạo ra db, và chèn năm bài báo giống hệt nhau

a= Article(name='finland',content='finland') 
db.session.add(a) 
db.session.commit() #a-e 

với 'finland' cả như tên và nội dung. Theo ví dụ:

Article.query.search(u'finland').limit(5).all() 

Sẽ có các bài viết được trả lại có giá trị một nơi nào đó trong đó. Trong trường hợp của tôi, tôi nhận được một danh sách trống. Tôi nhận lại một đối tượng nếu tôi sửa đổi truy vấn mẫu thành:

Article.query.search(' ').first() 

Nhưng tìm kiếm không gian trống là vô dụng. Bất kỳ ý tưởng?

Thêm một chút vào nó: Tôi nhận thấy trong bảng bài viết, cột 'search_vector tsvector' hoàn toàn trống mặc dù dữ liệu nằm trong cột nội dung và tên; Tôi không chắc liệu nó có liên quan gì đến nó không.

+0

Tôi ghét phải hỏi một câu hỏi rõ ràng ... nhưng bạn có chắc đó là một "finland" trong dữ liệu của bạn? Tôi tin rằng tìm kiếm sqlalchemy là trường hợp nhạy cảm ... có lẽ dữ liệu của bạn có một "Phần Lan" nhưng không có "finland"? – dylrei

+0

Câu hỏi hoàn toàn hợp lệ. Vâng, tôi chắc chắn họ giống nhau. Tôi đã thực sự tạo ra nhiều bản ghi hơn, với tên và nội dung cả hai đều là "chiếc bánh". Tôi chỉnh sửa bản gốc để làm cho finland trong tất cả các trường hợp thấp hơn. – Vyndion

+0

Có vẻ như bạn không nên lấy lại bất cứ thứ gì để tìm kiếm không gian. Bạn lấy lại 5 bản ghi "finland" mà bạn đã nhập nếu bạn làm 'Article.query.search ('') .all()'? – dylrei

Trả lời

8

Tôi cũng gặp sự cố chính xác này khi sử dụng Flask-Script để thêm công cụ quản lý manage.py vào đơn đăng ký của tôi.

Thực tế là cột search_vector bị trống mặc dù bạn đã thêm thông số TSVectorType thích hợp có nghĩa là trình kích hoạt SQLAlchemy-Searchable không có trong DB bài đăng. Bạn có thể xác minh sự vắng mặt của nó bằng cách thực hiện một công cụ dòng lệnh \df+ trong psql - bạn sẽ không thấy trình kích hoạt có tên article_search_vector_update. SQLAlchemy-Searchable thiết lập trình kích hoạt này để cập nhật nội dung của cột search_vector khi các cột có tên trong thay đổi TSVectorType(...).

Trong trường hợp của manage.py, tôi đã phải gọi đầu tiên:

db.configure_mappers() 

Về cơ bản, bạn phải cấu hình mappers SQLAlchemy của trước gọi create_all(). Nếu không làm điều này, SQLAlchemy-Searchable sẽ không có cơ hội để thêm kích hoạt search_vector để điền vào cột TSVectorType trong mô hình. SQLAlchemy-Searchable docs có thêm về điều này.

Tổng cộng, một tối thiểu manage.py rằng đúng cấu hình SQLAlchemy-Searchable như bạn yêu cầu có thể trông giống như:

#!/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() 
6

On câu trả lời Collin Allen: trên thực tế, bình-SQLAlchemy '' db '' cho thấy nhiều configure_mappers chức năng .

Thay thế:

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

với:

... 
db.configure_mappers() 
+0

Thật vậy, điều này hoạt động tuyệt vời! Tôi đã chỉnh sửa câu trả lời của tôi để phản ánh ghi chú của bạn. Cảm ơn! –

Các vấn đề liên quan