from typing import List from sqlalchemy.orm import Session from sqlalchemy.sql.expression import func from sqlalchemy import inspect from . import models, schemas from .database import Base def get_item(db: Session, item_id: int): """индивидуальные страницы для каждого Описания набора данных""" return db.query(models.Item).filter(models.Item.id == item_id).first() def get_item_by_description(db: Session, needle: str, skip: int = 0, limit: int = 20): """фильтры для поиска Описаний наборов данных по атрибутам дополнительный возможный синтаксис в запросах преобразуется в поисковый запрос содержащий: - простой текст: переданные слова в любом порядке - "текст в кавычках": переданные слова в указанном порядке - OR: какие-либо из переданных слов - -: не содержащий данного слова """ # hardcode russian for now # built-in postgress websearch_to_tsquery() is good # https://www.postgresql.org/docs/11/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES # TODO: add requested search columns [0] items_table = inspect(models.Item).local_table result = ( db.query(models.Item) .filter( items_table.c.geodata_search_ts.op("@@")(func.websearch_to_tsquery('"russian"', needle)) ) .order_by(items_table.c.id) .offset(skip) .limit(limit) .all() ) return result def get_items(db: Session, skip: int = 0, limit: int = 20): """список доступных в системе Описаний наборов данных""" return db.query(models.Item).offset(skip).limit(limit).all() def insert_items(db: Session, items: List[schemas.ItemCreate]): """импорт в базу данных Описаний наборов данных""" before = db.query(models.Item).count() accepted = len(items) # https://docs.sqlalchemy.org/en/14/dialects/postgresql.html#psycopg2-fast-execution-helpers modeled_items = (models.ItemCreate(**item.dict()) for item in items) db.add_all(modeled_items) db.commit() inserted = db.query(models.Item).count() - before return (accepted, inserted) def get_headers(db: Session): """полные заголовки таблиц""" return db.query(models.Header).all()