2015-03-22 7 views
9

साइट पर पहली बार, सभी को नमस्कार और अग्रिम धन्यवाद। लंबे समय तक लर्कर और नया।फ्लास्क-स्क्लचेचेमी + स्क्लेल्चेमी-खोजने योग्य खाली सूची

मैं फ्लास्क-एसक्ल एल्केमी और एसक्लएल्चेमी-सर्चबल (डॉक्स->https://sqlalchemy-searchable.readthedocs.org/en/latest/index.html) का उपयोग करके फ्लास्क में एक वेब ऐप पर काम कर रहा हूं। एक कारण से मैं समझ नहीं है, जब मैं डॉक्स पृष्ठ पर दिखाए गए कोड को एक समान उदाहरण का प्रयास करें:

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')) 

मेरे खोज प्रश्नों ठीक से काम नहीं करते। मैं एक अजगर खोल खोला और डाटाबेस बनाया है, और

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' कॉलम पूरी तरह खाली है; मुझे यकीन नहीं है कि इसके साथ क्या करने के लिए कुछ भी है।

+0

मैं एक स्पष्ट सवाल पूछने के लिए नफरत है ... लेकिन आप यकीन है कि आपके डेटा में एक "फिनलैंड" कर रहे हैं? मेरा मानना ​​है कि sqlalchemy खोज केस-संवेदी है ... शायद आपके डेटा में "फिनलैंड" है लेकिन कोई "फिनलैंड" नहीं है? – dylrei

+0

पूरी तरह से वैध प्रश्न। हाँ, मुझे यकीन है कि वे वही हैं। मैंने वास्तव में नाम और सामग्री दोनों के साथ "पाई" होने के साथ, अधिक रिकॉर्ड बना दिया था। मैंने सभी निचले मामले में फिनलैंड बनाने के लिए मूल संपादित किया। – Vyndion

+0

ऐसा लगता है कि आपको रिक्त स्थान के लिए कुछ भी वापस नहीं मिलना चाहिए। यदि आप 'Article.query.search ('') .all()' करते हैं तो क्या आप दर्ज किए गए 5 "फिनलैंड" रिकॉर्ड वापस लेते हैं? – dylrei

उत्तर

8

मैं अपने आवेदन में manage.py प्रबंधन उपकरण जोड़ने के लिए Flask-Script का उपयोग करते समय भी एक बार इस सटीक समस्या में भाग गया।

तथ्य यह है कि उचित TSVectorType पैरामीटर जोड़ने के बावजूद search_vector कॉलम खाली है, इसका मतलब है कि एसक्यूएलकेकी-सर्च करने योग्य ट्रिगर पोस्टग्रेज़ डीबी में मौजूद नहीं है। psql कमांड लाइन टूल में \df+ करके आप इसकी अनुपस्थिति को सत्यापित कर सकते हैं - आपको article_search_vector_update नामक ट्रिगर दिखाई नहीं देगा। TSVectorType(...) में नामित कॉलम बदलते समय SQLAlchemy-Searchable search_vector कॉलम की सामग्री को अपडेट करने के लिए इस ट्रिगर को सेट करता है।

manage.py के मामले में, मैं पहली बार कॉल किया था:

db.configure_mappers() 

अनिवार्य रूप से, आप SQLAlchemy के मानचित्रकारों से पहले create_all() बुला कॉन्फ़िगर करने के लिए की है। ऐसा करने के बिना, SQLAlchemy-Searchable को search_vector मॉडल में TSVectorType कॉलम को पॉप्युलेट करने के लिए ट्रिगर करने का अवसर नहीं दिया जाएगा। SQLAlchemy-Searchable docs इस पर और अधिक है।

कुल में, एक न्यूनतम manage.py कि ठीक से SQLAlchemy-खोज योग्य कॉन्फ़िगर करता है के रूप में आप की आवश्यकता होती है ऐसा दिखाई देगा:

#!/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

कोलिन एलेन की जवाब पर: वास्तव में, कुप्पी के SQLAlchemy '' डाटाबेस '' को उजागर करता है configure_mappers समारोह ।

बदलें:

साथ
from sqlalchemy.orm.mapper import configure_mappers 
... 
configure_mappers() 

:

... 
db.configure_mappers() 
+0

दरअसल, यह बहुत अच्छा काम करता है! मैंने आपके नोट को प्रतिबिंबित करने के लिए अपना जवाब संपादित कर लिया है। धन्यवाद! –

संबंधित मुद्दे