Тема: Робота з хмарними базами даних (DBaaS).
Розгортання керованої реляційної бази даних; підключення до БД з хмарного застосунку; виконання базових операцій; налаштування резервного копіювання; знайомство з NoSQL-сервісом.
Мета: Набути практичні навички розгортання та адміністрування хмарних керованих баз даних, підключення до них з застосунків, виконання SQL-запитів та ознайомлення з NoSQL-рішеннями.
Технологічний стек:
Neon — serverless PostgreSQL з безкоштовним рівнем (0.5 vCPU, 1 GB RAM).
lab11-dbПісля створення скопіюйте Connection string (виглядає як: postgresql://user:password@host/dbname?sslmode=require)
Через psql (CLI):
# Встановлення psql
sudo apt install -y postgresql-client # Linux
brew install postgresql # macOS
# Windows: з офіційного інсталятора PostgreSQL
# Підключення (вставте рядок підключення з Neon)
psql "postgresql://user:password@host/dbname?sslmode=require"
Через DBeaver (GUI):
У підключеній сесії psql або DBeaver виконайте:
-- Створення таблиці студентів
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) UNIQUE NOT NULL,
group_name VARCHAR(50),
enrollment_year INTEGER DEFAULT EXTRACT(YEAR FROM NOW()),
created_at TIMESTAMP DEFAULT NOW()
);
-- Вставка даних
INSERT INTO students (name, email, group_name) VALUES
('Іван Петренко', 'ivan.petrenko@example.com', 'КН-41'),
('Марія Коваленко', 'maria.kovalenko@example.com', 'КН-41'),
('Олег Сидоренко', 'oleg.sydorenko@example.com', 'КН-42'),
('Анна Мельник', 'anna.melnyk@example.com', 'КН-42');
-- SELECT-запити
SELECT * FROM students;
SELECT name, email FROM students WHERE group_name = 'КН-41';
SELECT group_name, COUNT(*) AS count FROM students GROUP BY group_name;
-- UPDATE
UPDATE students SET group_name = 'КН-41м' WHERE name = 'Іван Петренко';
-- Перевірка
SELECT * FROM students WHERE name = 'Іван Петренко';
Створіть другу таблицю та JOIN:
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
credits INTEGER
);
CREATE TABLE enrollments (
student_id INTEGER REFERENCES students(id),
course_id INTEGER REFERENCES courses(id),
grade DECIMAL(3,1),
PRIMARY KEY (student_id, course_id)
);
INSERT INTO courses (name, credits) VALUES
('Хмарні технології', 4),
('Бази даних', 3),
('Веб-розробка', 4);
INSERT INTO enrollments VALUES (1, 1, 90.5), (1, 2, 85.0), (2, 1, 92.0), (2, 3, 88.5);
-- JOIN-запит: студенти та їхні курси
SELECT s.name AS student, c.name AS course, e.grade
FROM enrollments e
JOIN students s ON e.student_id = s.id
JOIN courses c ON e.course_id = c.id
ORDER BY s.name, c.name;
Додайте в застосунок з Лаб. №10:
npm install pg
// db.js
const { Pool } = require("pg");
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
ssl: { rejectUnauthorized: false },
});
module.exports = pool;
// Додайте до server.js
const pool = require("./db");
app.get("/students", async (req, res) => {
try {
const result = await pool.query("SELECT * FROM students ORDER BY id");
res.json(result.rows);
} catch (err) {
res.status(500).json({ error: err.message });
}
});
app.post("/students", express.json(), async (req, res) => {
const { name, email, group_name } = req.body;
try {
const result = await pool.query(
"INSERT INTO students (name, email, group_name) VALUES ($1, $2, $3) RETURNING *",
[name, email, group_name],
);
res.status(201).json(result.rows[0]);
} catch (err) {
res.status(400).json({ error: err.message });
}
});
Встановіть DATABASE_URL у змінних оточення Railway/Render (вставте рядок підключення з Neon).
# Тест через cURL
curl https://<your-app-url>/students
curl -X POST https://<your-app-url>/students \
-H "Content-Type: application/json" \
-d '{"name":"Тест Тестенко","email":"test@example.com","group_name":"КН-41"}'
# Створення таблиці (через AWS CLI)
aws dynamodb create-table \
--table-name lab11-students \
--attribute-definitions AttributeName=student_id,AttributeType=S \
--key-schema AttributeName=student_id,KeyType=HASH \
--billing-mode PAY_PER_REQUEST \
--region eu-central-1
# Запис елементу
aws dynamodb put-item \
--table-name lab11-students \
--item '{"student_id":{"S":"1"},"name":{"S":"Іван Петренко"},"group":{"S":"КН-41"}}' \
--region eu-central-1
# Читання елементу
aws dynamodb get-item \
--table-name lab11-students \
--key '{"student_id":{"S":"1"}}' \
--region eu-central-1
# Сканування таблиці
aws dynamodb scan --table-name lab11-students --region eu-central-1
# Видалення таблиці
aws dynamodb delete-table --table-name lab11-students --region eu-central-1
Neon: Автоматичні бекапи включені безкоштовно — 7 днів зберігання.
mainРучний бекап (dump):
pg_dump "postgresql://user:password@host/dbname?sslmode=require" \
--format=custom \
--file=lab11_backup_$(date +%Y%m%d).dump
# Перевірка: список таблиць у дампі
pg_restore --list lab11_backup_*.dump
$1, $2) захищають від цієї атаки?curl /students з даними з БД через веб-застосунокlab11.md