начало добавления поиска
This commit is contained in:
187
main.py
187
main.py
@@ -40,8 +40,8 @@ def get_connection():
|
|||||||
dbname="parsed_url",
|
dbname="parsed_url",
|
||||||
user="postgres",
|
user="postgres",
|
||||||
password="qwertyqwerty123123",
|
password="qwertyqwerty123123",
|
||||||
host="127.0.0.1"
|
# host="127.0.0.1"
|
||||||
# host ="45.129.78.228"
|
host ="45.129.78.228"
|
||||||
)
|
)
|
||||||
|
|
||||||
@app.post("/save_parsed_data", summary="Сохранить данные парсинга")
|
@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:
|
if conn:
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
@app.get("/records_all", summary="Получить все записи из БД + сортирует", response_model=List[ParsedData])
|
@app.get("/records_all/count", summary="Получить общее количество записей")
|
||||||
def get_records(item: str = "default"):
|
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 с учетом.
|
Возвращает записи из таблицы url с учетом.
|
||||||
"""
|
"""
|
||||||
@@ -199,24 +330,28 @@ def get_records(item: str = "default"):
|
|||||||
cur.execute("""
|
cur.execute("""
|
||||||
SELECT * FROM url
|
SELECT * FROM url
|
||||||
ORDER BY viewed ASC, parsed_at DESC
|
ORDER BY viewed ASC, parsed_at DESC
|
||||||
""")
|
OFFSET %s LIMIT %s
|
||||||
|
""", (offset, limit))
|
||||||
elif item == "viewed":
|
elif item == "viewed":
|
||||||
cur.execute("""
|
cur.execute("""
|
||||||
SELECT * FROM url
|
SELECT * FROM url
|
||||||
WHERE viewed = true
|
WHERE viewed = true
|
||||||
ORDER BY article_date DESC
|
ORDER BY article_date DESC
|
||||||
""")
|
OFFSET %s LIMIT %s
|
||||||
|
""", (offset, limit))
|
||||||
elif item == "status":
|
elif item == "status":
|
||||||
cur.execute("""
|
cur.execute("""
|
||||||
SELECT * FROM url
|
SELECT * FROM url
|
||||||
WHERE status = true
|
WHERE status = true
|
||||||
ORDER BY parsed_at DESC
|
ORDER BY parsed_at DESC
|
||||||
""")
|
OFFSET %s LIMIT %s
|
||||||
|
""", (offset, limit))
|
||||||
else:
|
else:
|
||||||
cur.execute("""
|
cur.execute("""
|
||||||
SELECT * FROM url
|
SELECT * FROM url
|
||||||
ORDER BY viewed ASC, article_date DESC
|
ORDER BY viewed ASC, article_date DESC
|
||||||
""")
|
OFFSET %s LIMIT %s
|
||||||
|
""", (offset, limit))
|
||||||
rows = cur.fetchall()
|
rows = cur.fetchall()
|
||||||
results = [dict(row) for row in rows]
|
results = [dict(row) for row in rows]
|
||||||
# urls = [item['parsed_at'] for item in results]
|
# urls = [item['parsed_at'] for item in results]
|
||||||
@@ -226,36 +361,10 @@ def get_records(item: str = "default"):
|
|||||||
finally:
|
finally:
|
||||||
if conn:
|
if conn:
|
||||||
conn.close()
|
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__":
|
if __name__ == "__main__":
|
||||||
# uvicorn.run("main:app", port=8002, reload=True)
|
uvicorn.run("main:app", port=8002, reload=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user