Загрузка данных


from flask import Flask, render_template, request, abort
import psycopg2
from psycopg2 import OperationalError

app = Flask(__name__)

DB_HOST = "172.16.2.38"
DB_PORT = 5432
DB_NAME = "test"          
DB_USER = "dev_intern"
DB_PASSWORD = "Cneltynbr33"

def get_db_connection():
    """Создаёт и возвращает соединение с PostgreSQL."""
    print("попытка подключения к бд")
    try:
        conn = psycopg2.connect(
            host=DB_HOST,
            port=DB_PORT,
            dbname=DB_NAME,
            user=DB_USER,
            password=DB_PASSWORD
        )
        print("подключение к бд установлено")
        return conn
    except OperationalError as e:
        print(f"ошибка подключения: {e}")
        raise
        app.logger.error(f"Ошибка подключения к БД: {e}")
        abort(500, description="Не удалось подключиться к базе данных")

# -------------------- Маршруты --------------------
@app.route("/")
def index():
    """Главная страница с навигацией."""
    return render_template("index.html")

@app.route("/rabotnik")
def show_rabotnik():
    """Вывод всей таблицы rabotnik."""
    conn = get_db_connection()
    try:
        cur = conn.cursor()
        cur.execute("SELECT * FROM rabotnik ORDER BY id;")
        rows = cur.fetchall()
        columns = [desc[0] for desc in cur.description]
        cur.close()
        return render_template("table.html", title="Список работников (rabotnik)",
                               columns=columns, rows=rows)
    except Exception as e:
        app.logger.error(f"Ошибка чтения rabotnik: {e}")
        abort(500, description="Ошибка получения данных о работниках")
    finally:
        conn.close()

@app.route("/deti")
def show_deti():
    """Вывод всей таблицы deti."""
    conn = get_db_connection()
    try:
        cur = conn.cursor()
        cur.execute("SELECT * FROM deti ORDER BY id;")
        rows = cur.fetchall()
        columns = [desc[0] for desc in cur.description]
        cur.close()
        return render_template("table.html", title="Список детей (deti)",
                               columns=columns, rows=rows)
    except Exception as e:
        app.logger.error(f"Ошибка чтения deti: {e}")
        abort(500, description="Ошибка получения данных о детях")
    finally:
        conn.close()

@app.route("/join")
def join_data():
    """
    Вывод объединённых данных: для каждого ребёнка показываем информацию о нём и о его родителе (JOIN по Tabnum).
    Можно также отфильтровать по табельному номеру родителя (?tabnum=...).
    """
    tabnum_filter = request.args.get("tabnum", "").strip()
    conn = get_db_connection()
    try:
        cur = conn.cursor()
        # Базовый запрос с JOIN
        query = """
            SELECT r.Tabnum, r.fam, r.imja, r.otch, r.nam_dol,
                   d.step_rod, d.fam_rod, d.imja_rod, d.otch_rod,
                   d.pol_rod, d.drog_rod
            FROM rabotnik r
            JOIN deti d ON r.Tabnum = d.tabnum
        """
        params = ()
        if tabnum_filter:
            query += " WHERE r.Tabnum = %s"
            params = (tabnum_filter,)
        query += " ORDER BY r.fam, d.imja_rod;"

        cur.execute(query, params)
        rows = cur.fetchall()
        columns = [desc[0] for desc in cur.description]
        cur.close()

        title = "Объединённые данные (работник + дети)"
        if tabnum_filter:
            title += f" (таб.номер: {tabnum_filter})"
        if not rows:
            title += " — данных нет"

        return render_template("table.html", title=title, columns=columns, rows=rows)
    except Exception as e:
        app.logger.error(f"Ошибка JOIN: {e}")
        abort(500, description="Ошибка выполнения запроса с JOIN")
    finally:
        conn.close()

# -------------------- Запуск --------------------
if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=5000)