начало добавления поиска
This commit is contained in:
185
main.py
185
main.py
@@ -40,8 +40,8 @@ def get_connection():
|
||||
dbname="parsed_url",
|
||||
user="postgres",
|
||||
password="qwertyqwerty123123",
|
||||
host="127.0.0.1"
|
||||
# host ="45.129.78.228"
|
||||
# host="127.0.0.1"
|
||||
host ="45.129.78.228"
|
||||
)
|
||||
|
||||
@app.post("/save_parsed_data", summary="Сохранить данные парсинга")
|
||||
@@ -185,8 +185,139 @@ def get_records(offset: int = Query(0, ge=0), limit: int = Query(10, ge=1, le=10
|
||||
if conn:
|
||||
conn.close()
|
||||
|
||||
@app.get("/records_all", summary="Получить все записи из БД + сортирует", response_model=List[ParsedData])
|
||||
def get_records(item: str = "default"):
|
||||
@app.get("/records_all/count", summary="Получить общее количество записей")
|
||||
def get_records_count(item: str = "default"):
|
||||
"""
|
||||
Возвращает общее количество записей в таблице.
|
||||
"""
|
||||
conn = None
|
||||
try:
|
||||
conn = get_connection()
|
||||
with conn.cursor() as cur:
|
||||
if item == "viewed":
|
||||
cur.execute("SELECT COUNT(*) FROM url WHERE viewed = true")
|
||||
elif item == "status":
|
||||
cur.execute("SELECT COUNT(*) FROM url WHERE status = true")
|
||||
else:
|
||||
cur.execute("SELECT COUNT(*) FROM url")
|
||||
result = cur.fetchone()
|
||||
return {"count": result[0]}
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"Ошибка при получении количества: {e}")
|
||||
finally:
|
||||
if conn:
|
||||
conn.close()
|
||||
|
||||
|
||||
# @app.get("/poisk", summary="Поиск по текстовым полям", response_model=List[ParsedData])
|
||||
# def poisk(
|
||||
# query: str = Query(..., description="Строка для поиска"),
|
||||
# offset: int = Query(0, ge=0),
|
||||
# limit: int = Query(10, ge=1, le=500)
|
||||
# ):
|
||||
# """
|
||||
# Поиск по текстовым полям таблицы url (title, original_text, translation_text, short_text, url, category, other).
|
||||
# Частичное совпадение без учета регистра (ILIKE).
|
||||
# """
|
||||
# conn = None
|
||||
# try:
|
||||
# conn = get_connection()
|
||||
# with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
|
||||
# search_pattern = f"%{query}%"
|
||||
# cur.execute("""
|
||||
# SELECT * FROM url
|
||||
# WHERE title ILIKE %s
|
||||
# OR original_text ILIKE %s
|
||||
# OR translation_text ILIKE %s
|
||||
# OR short_text ILIKE %s
|
||||
# OR url ILIKE %s
|
||||
# OR category ILIKE %s
|
||||
# OR other ILIKE %s
|
||||
# ORDER BY parsed_at DESC
|
||||
# OFFSET %s LIMIT %s
|
||||
# """, (search_pattern, search_pattern, search_pattern, search_pattern,
|
||||
# search_pattern, search_pattern, search_pattern, offset, limit))
|
||||
# rows = cur.fetchall()
|
||||
# results = [dict(row) for row in rows]
|
||||
# return results
|
||||
# except Exception as e:
|
||||
# raise HTTPException(status_code=500, detail=f"Ошибка при поиске: {e}")
|
||||
# finally:
|
||||
# if conn:
|
||||
# conn.close()
|
||||
|
||||
# @app.get("/poisk/count", summary="Получить количество результатов поиска")
|
||||
# def get_poisk_count(query: str):
|
||||
# conn = None
|
||||
# try:
|
||||
# conn = get_connection()
|
||||
# with conn.cursor() as cur:
|
||||
# cur.execute(
|
||||
# "SELECT COUNT(*) FROM url WHERE title ILIKE %s OR original_text ILIKE %s",
|
||||
# (f"%{query}%", f"%{query}%")
|
||||
# )
|
||||
# result = cur.fetchone()
|
||||
# return {"count": result[0]}
|
||||
# except Exception as e:
|
||||
# raise HTTPException(status_code=500, detail=f"Ошибка при получении количества: {e}")
|
||||
# finally:
|
||||
# if conn:
|
||||
# conn.close()
|
||||
@app.get("/poisk/count", summary="Получить количество результатов поиска")
|
||||
def get_poisk_count(query: str, item: str = "default"):
|
||||
conn = None
|
||||
try:
|
||||
conn = get_connection()
|
||||
with conn.cursor() as cur:
|
||||
base_query = "SELECT COUNT(*) FROM url WHERE (title ILIKE %s OR original_text ILIKE %s)"
|
||||
params = [f"%{query}%", f"%{query}%"]
|
||||
|
||||
if item == "viewed":
|
||||
base_query += " AND viewed = true"
|
||||
elif item == "status":
|
||||
base_query += " AND status = true"
|
||||
|
||||
cur.execute(base_query, params)
|
||||
result = cur.fetchone()
|
||||
return {"count": result[0]}
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"Ошибка при получении количества: {e}")
|
||||
finally:
|
||||
if conn:
|
||||
conn.close()
|
||||
|
||||
@app.get("/poisk", summary="Поиск с пагинацией")
|
||||
def poisk(query: str, offset: int = Query(0, ge=0), limit: int = Query(10, ge=1, le=100), item: str = "default"):
|
||||
conn = None
|
||||
try:
|
||||
conn = get_connection()
|
||||
with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
|
||||
base_query = """
|
||||
SELECT * FROM url
|
||||
WHERE (title ILIKE %s OR original_text ILIKE %s)
|
||||
"""
|
||||
params = [f"%{query}%", f"%{query}%"]
|
||||
|
||||
if item == "viewed":
|
||||
base_query += " AND viewed = true"
|
||||
elif item == "status":
|
||||
base_query += " AND status = true"
|
||||
|
||||
base_query += " ORDER BY article_date DESC OFFSET %s LIMIT %s"
|
||||
params.extend([offset, limit])
|
||||
|
||||
cur.execute(base_query, params)
|
||||
rows = cur.fetchall()
|
||||
results = [dict(row) for row in rows]
|
||||
return results
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"Ошибка при поиске: {e}")
|
||||
finally:
|
||||
if conn:
|
||||
conn.close()
|
||||
|
||||
@app.get("/records_all", summary="Получить все записи из БД + сортирует + пагинация", response_model=List[ParsedData])
|
||||
def get_records(item: str = "default", offset: int = Query(0, ge=0), limit: int = Query(10, ge=1, le=500)):
|
||||
"""
|
||||
Возвращает записи из таблицы url с учетом.
|
||||
"""
|
||||
@@ -199,24 +330,28 @@ def get_records(item: str = "default"):
|
||||
cur.execute("""
|
||||
SELECT * FROM url
|
||||
ORDER BY viewed ASC, parsed_at DESC
|
||||
""")
|
||||
OFFSET %s LIMIT %s
|
||||
""", (offset, limit))
|
||||
elif item == "viewed":
|
||||
cur.execute("""
|
||||
SELECT * FROM url
|
||||
WHERE viewed = true
|
||||
ORDER BY article_date DESC
|
||||
""")
|
||||
OFFSET %s LIMIT %s
|
||||
""", (offset, limit))
|
||||
elif item == "status":
|
||||
cur.execute("""
|
||||
SELECT * FROM url
|
||||
WHERE status = true
|
||||
ORDER BY parsed_at DESC
|
||||
""")
|
||||
OFFSET %s LIMIT %s
|
||||
""", (offset, limit))
|
||||
else:
|
||||
cur.execute("""
|
||||
SELECT * FROM url
|
||||
ORDER BY viewed ASC, article_date DESC
|
||||
""")
|
||||
OFFSET %s LIMIT %s
|
||||
""", (offset, limit))
|
||||
rows = cur.fetchall()
|
||||
results = [dict(row) for row in rows]
|
||||
# urls = [item['parsed_at'] for item in results]
|
||||
@@ -227,35 +362,9 @@ def get_records(item: str = "default"):
|
||||
if conn:
|
||||
conn.close()
|
||||
|
||||
# @app.get("/records_all_status", summary="Получить все записи избранного", response_model=List[ParsedData])
|
||||
# def get_records():
|
||||
# """
|
||||
# Возвращает записи из таблицы url с избранным.
|
||||
# """
|
||||
# conn = None
|
||||
# try:
|
||||
# conn = get_connection()
|
||||
# with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
|
||||
# cur.execute("""
|
||||
# SELECT * FROM url
|
||||
# WHERE status
|
||||
# ORDER BY parsed_at DESC
|
||||
# """)
|
||||
# rows = cur.fetchall()
|
||||
# results = [dict(row) for row in rows]
|
||||
# urls = [item['parsed_at'] for item in results]
|
||||
|
||||
# print(urls)
|
||||
# return results
|
||||
# except Exception as e:
|
||||
# raise HTTPException(status_code=500, detail=f"Ошибка при получении записей из БД: {e}")
|
||||
# finally:
|
||||
# if conn:
|
||||
# conn.close()
|
||||
|
||||
# get_records()
|
||||
|
||||
# Запуск сервера для теста
|
||||
# if __name__ == "__main__":
|
||||
# uvicorn.run("main:app", port=8002, reload=True)
|
||||
if __name__ == "__main__":
|
||||
uvicorn.run("main:app", port=8002, reload=True)
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user