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