Не удается получить доступ к данным после полнотекстового поиска с использованием sqlalchemy, postgres и flask - PullRequest
1 голос
/ 08 октября 2019

Я бы хотел выполнить поиск в своей базе данных postgres, используя встроенную возможность полнотекстового поиска postgres. В моем приложении у меня есть набор сообщений, сохраненных в соответствии с заголовком, содержанием и датой. Я думаю, что могу искать в базе данных, используя tsvector, но не могу извлечь данные из результатов;т.е. название, содержание и дата. Может ли кто-нибудь помочь мне, пожалуйста?

import json, sys
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy

from sqlalchemy.dialects import postgresql
from sqlalchemy.sql.expression import cast, func
from sqlalchemy import Index

def create_tsvector(*args):
    exp = args[0]
    for e in args[1:]:
        exp += ' ' + e
    return func.to_tsvector('english', exp)

app = Flask(__name__)
app.config['SECRET_KEY'] = 'some_key'
app.config["SQLALCHEMY_DATABASE_URI"] = 'postgresql:somedb'

db = SQLAlchemy(app)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.Text, nullable=False)
    content = db.Column(db.Text, nullable=False)
    date = db.Column(db.Text,unique=False)

    __ts_vector__ = create_tsvector(
        cast(func.coalesce(content, ''), postgresql.TEXT)
    )

    __table_args__ = (Index('idx_post_fts', __ts_vector__, postgresql_using='gin'), )


    def __repr__(self):
        return f"Post('{self.title}', '{self.date}')"


if len(sys.argv) > 1:
    filename1 = sys.argv[1]

infile=open(filename1,'r')
posts=json.load(infile)
infile.close()
List=list(posts)

art = 0
for j in range(0,len(List)):
    if j % 10 == 0:
        print(j)
    title= posts[List[art]]['Title']
    date = posts[List[art]]['Posted']
    content=posts[List[art]]['Text']
    post = Post(title=title, date=date, content=content)
    db.session.add(post)
    db.session.commit()
    art+=1


from sqlalchemy.dialects.postgresql import TSVECTOR
from sqlalchemy import select, cast

posts = Post.__ts_vector__.match("bicycle", postgresql_regconfig='english')

print(posts)
...