Загрузка данных
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)