You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
geodata-catalog/src/crud.py

63 lines
2.5 KiB

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