46 lines
1.6 KiB
Python
46 lines
1.6 KiB
Python
# Изменено: 2026-03-14
|
|
# Функция event-cleaner: удаляет N самых старых строк из таблицы events.
|
|
# Вызывается через HTTP POST из Node-RED (который слушает RabbitMQ).
|
|
# Env: POSTGRES_DSN — строка подключения к PostgreSQL.
|
|
|
|
import os
|
|
import json
|
|
import psycopg2
|
|
|
|
def handle(request):
|
|
"""Удаляет N старейших строк из таблицы events."""
|
|
dsn = os.environ["POSTGRES_DSN"]
|
|
|
|
body = {}
|
|
if request.get_data():
|
|
try:
|
|
body = json.loads(request.get_data())
|
|
except Exception:
|
|
pass
|
|
|
|
# Количество строк для удаления — из тела запроса или дефолт 10
|
|
delete_n = int(body.get("delete_n", 10))
|
|
# Защита от случайного удаления слишком большого количества строк
|
|
delete_n = min(delete_n, 100)
|
|
|
|
conn = psycopg2.connect(dsn)
|
|
try:
|
|
with conn.cursor() as cur:
|
|
cur.execute("""
|
|
DELETE FROM events
|
|
WHERE id IN (
|
|
SELECT id FROM events ORDER BY created_at ASC LIMIT %s
|
|
)
|
|
""", (delete_n,))
|
|
deleted = cur.rowcount
|
|
cur.execute("SELECT COUNT(*) FROM events")
|
|
remaining = cur.fetchone()[0]
|
|
conn.commit()
|
|
return json.dumps({
|
|
"ok": True,
|
|
"deleted": deleted,
|
|
"remaining": remaining
|
|
}), 200, {"Content-Type": "application/json"}
|
|
finally:
|
|
conn.close()
|