начало добавления поиска

This commit is contained in:
2026-03-14 10:14:59 +10:00
parent 97e2b46f25
commit 424c82fa1c

185
main.py
View File

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