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


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 = "dev_intern"          # !!! Замените на реальное имя базы данных
DB_USER = "dev_intern"
DB_PASSWORD = "Cneltynbr33"

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

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

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

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

@app.route("/employee/<int:emp_id>/children")
def employee_children(emp_id):
    """
    Пример запроса с JOIN: выводит детей конкретного работника,
    объединяя таблицы employees и children.
    """
    conn = get_db_connection()
    try:
        cur = conn.cursor()
        query = """
            SELECT e.full_name AS employee_name,
                   c.child_name,
                   c.birth_date
            FROM employees e
            JOIN children c ON e.id = c.employee_id
            WHERE e.id = %s
            ORDER BY c.child_name;
        """
        cur.execute(query, (emp_id,))
        rows = cur.fetchall()
        columns = [desc[0] for desc in cur.description] if rows else []
        cur.close()

        if not rows:
            return f"<h2>У работника с ID {emp_id} детей не найдено.</h2>"

        # Простой HTML-вывод результата запроса
        html = f"<h2>Дети сотрудника ID={emp_id}</h2><table border='1'><tr>"
        html += "".join(f"<th>{col}</th>" for col in columns) + "</tr>"
        for row in rows:
            html += "<tr>" + "".join(f"<td>{val}</td>" for val in row) + "</tr>"
        html += "</table><br><a href='/'>На главную</a>"
        return html
    except Exception as e:
        app.logger.error(f"Ошибка запроса с JOIN: {e}")
        abort(500, description="Ошибка выполнения запроса")
    finally:
        conn.close()

# -------------------- Создание таблиц (опционально) --------------------
def init_db():
    """Создаёт таблицы, если их ещё нет (для демонстрации)."""
    conn = get_db_connection()
    try:
        cur = conn.cursor()
        cur.execute("""
            CREATE TABLE IF NOT EXISTS employees (
                id SERIAL PRIMARY KEY,
                full_name VARCHAR(100) NOT NULL,
                position VARCHAR(100)
            );
            CREATE TABLE IF NOT EXISTS children (
                id SERIAL PRIMARY KEY,
                employee_id INTEGER REFERENCES employees(id) ON DELETE CASCADE,
                child_name VARCHAR(100) NOT NULL,
                birth_date DATE
            );
        """)
        conn.commit()
        cur.close()
    except Exception as e:
        app.logger.error(f"Ошибка инициализации таблиц: {e}")
        conn.rollback()
    finally:
        conn.close()

# -------------------- Запуск --------------------
if __name__ == "__main__":
    # Попытка создать таблицы при старте (если есть права)
    with app.app_context():
        try:
            init_db()
            print("Таблицы готовы к работе.")
        except Exception as e:
            print(f"Не удалось инициализировать БД: {e}")

    app.run(debug=True, host="0.0.0.0", port=5000)