Привет, юные программисты! 👋
Сегодня мы отправимся в увлекательное путешествие в мир баз данных! Представьте, что у вас есть огромная библиотека с миллионами книг. Как найти нужную книгу быстро? Правильно - нужна система организации! Базы данных - это именно такая система для компьютерной информации.
База данных - это организованное хранилище информации, где данные структурированы так, чтобы их можно было легко найти, изменить или добавить новые. Это как супер-организованный шкаф, где каждая вещь лежит на своем месте!
Обычная куча книг = Файлы на компьютере без организации
⬇️
Организованная библиотека = База данных
📖 Книги = Записи (строки)
📝 Каталожные карточки = Таблицы
🏷️ Информация на карточке = Поля (столбцы)
Таблица - это основа базы данных. Представьте таблицу Excel - у неё есть строки и столбцы.
Пример таблицы "Ученики":
ID | Имя | Возраст | Класс | Любимый предмет
---|--------|---------|-------|----------------
1 | Аня | 12 | 6А | Математика
2 | Максим | 13 | 7Б | Информатика
3 | София | 11 | 5В | Литература
Запись (строка) - информация об одном объекте (например, об одном ученике)
Поле (столбец) - определённый тип информации (имя, возраст, класс)
Первичный ключ - уникальный идентификатор записи (ID)
Давайте создадим свою первую базу данных! Мы будем использовать SQLite - простую базу данных, которая идеально подходит для изучения.
import sqlite3
# Создаём подключение к базе данных
# Если файла нет, он создастся автоматически
conn = sqlite3.connect('моя_школа.db')
cursor = conn.cursor()
# Создаём таблицу учеников
cursor.execute('''
CREATE TABLE IF NOT EXISTS ученики (
id INTEGER PRIMARY KEY AUTOINCREMENT,
имя TEXT NOT NULL,
возраст INTEGER,
класс TEXT,
любимый_предмет TEXT
)
''')
print("База данных создана! 🎉")
conn.commit()
💡 Совет:
PRIMARY KEY AUTOINCREMENT - означает, что ID будет автоматически увеличиваться
NOT NULL - поле не может быть пустым
TEXT, INTEGER - типы данных
# Добавляем одного ученика
cursor.execute('''
INSERT INTO ученики (имя, возраст, класс, любимый_предмет)
VALUES (?, ?, ?, ?)
''', ('Аня', 12, '6А', 'Математика'))
# Добавляем несколько учеников сразу
ученики = [
('Максим', 13, '7Б', 'Информатика'),
('София', 11, '5В', 'Литература'),
('Денис', 12, '6А', 'Физика'),
('Катя', 14, '8А', 'Биология')
]
cursor.executemany('''
INSERT INTO ученики (имя, возраст, класс, любимый_предмет)
VALUES (?, ?, ?, ?)
''', ученики)
print("Ученики добавлены! 📚")
conn.commit()
# Получаем всех учеников
cursor.execute('SELECT * FROM ученики')
все_ученики = cursor.fetchall()
print("Все ученики в школе:")
for ученик in все_ученики:
print(f"ID: {ученик[0]}, Имя: {ученик[1]}, Возраст: {ученик[2]}, "
f"Класс: {ученик[3]}, Любимый предмет: {ученик[4]}")
print("\n" + "="*50 + "\n")
# Ищем учеников определённого возраста
cursor.execute('SELECT * FROM ученики WHERE возраст = ?', (12,))
ученики_12_лет = cursor.fetchall()
print("Ученики 12 лет:")
for ученик in ученики_12_лет:
print(f"{ученик[1]} из класса {ученик[3]}")
# Аня перешла в 7 класс!
cursor.execute('''
UPDATE ученики
SET класс = ?
WHERE имя = ?
''', ('7А', 'Аня'))
# Проверяем изменения
cursor.execute('SELECT * FROM ученики WHERE имя = ?', ('Аня',))
аня = cursor.fetchone()
print(f"Аня теперь в классе: {аня[3]}")
conn.commit()
# Осторожно! Удаляем ученика (например, если он перевёлся)
cursor.execute('DELETE FROM ученики WHERE имя = ?', ('Денис',))
print("Денис удалён из базы данных")
conn.commit()
# Не забываем закрыть соединение
conn.close()
Давайте создадим более интересный проект - базу данных ваших любимых игр!
import sqlite3
from datetime import datetime
class БазаДанныхИгр:
def __init__(self, файл_бд='мои_игры.db'):
self.conn = sqlite3.connect(файл_бд)
self.cursor = self.conn.cursor()
self.создать_таблицы()
def создать_таблицы(self):
# Создаём таблицу игр
self.cursor.execute('''
CREATE TABLE IF NOT EXISTS игры (
id INTEGER PRIMARY KEY AUTOINCREMENT,
название TEXT NOT NULL,
жанр TEXT,
платформа TEXT,
рейтинг INTEGER CHECK(рейтинг >= 1 AND рейтинг <= 10),
пройдена BOOLEAN DEFAULT FALSE,
дата_добавления TEXT
)
''')
# Создаём таблицу друзей
self.cursor.execute('''
CREATE TABLE IF NOT EXISTS друзья (
id INTEGER PRIMARY KEY AUTOINCREMENT,
имя TEXT NOT NULL,
любимая_игра_id INTEGER,
FOREIGN KEY (любимая_игра_id) REFERENCES игры (id)
)
''')
self.conn.commit()
def добавить_игру(self, название, жанр, платформа, рейтинг):
дата = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
self.cursor.execute('''
INSERT INTO игры (название, жанр, платформа, рейтинг, дата_добавления)
VALUES (?, ?, ?, ?, ?)
''', (название, жанр, платформа, рейтинг, дата))
self.conn.commit()
print(f"Игра '{название}' добавлена! 🎮")
def показать_все_игры(self):
self.cursor.execute('SELECT * FROM игры ORDER BY рейтинг DESC')
игры = self.cursor.fetchall()
if not игры:
print("В базе данных пока нет игр! 🎮")
return
print("\n🎮 МОИ ИГРЫ:")
print("-" * 80)
for игра in игры:
статус = "✅ Пройдена" if игра[5] else "⏳ В процессе"
print(f"📝 {игра[1]} | {игра[2]} | {игра[3]} | "
f"Рейтинг: {игра[4]}/10 | {статус}")
def отметить_пройденной(self, название):
self.cursor.execute('''
UPDATE игры SET пройдена = TRUE WHERE название = ?
''', (название,))
if self.cursor.rowcount > 0:
print(f"Поздравляем! Игра '{название}' отмечена как пройденная! 🏆")
else:
print(f"Игра '{название}' не найдена в базе данных 😕")
self.conn.commit()
def лучшие_игры(self, минимальный_рейтинг=8):
self.cursor.execute('''
SELECT название, рейтинг FROM игры
WHERE рейтинг >= ?
ORDER BY рейтинг DESC
''', (минимальный_рейтинг,))
игры = self.cursor.fetchall()
if игры:
print(f"\n⭐ ЛУЧШИЕ ИГРЫ (рейтинг {минимальный_рейтинг}+):")
for игра in игры:
print(f"🏆 {игра[0]} - {игра[1]}/10")
else:
print(f"Нет игр с рейтингом {минимальный_рейтинг}+ 😅")
def закрыть(self):
self.conn.close()
# Используем нашу базу данных
игры_бд = БазаДанныхИгр()
# Добавляем игры
игры_бд.добавить_игру("Minecraft", "Песочница", "PC", 9)
игры_бд.добавить_игру("Among Us", "Социальная дедукция", "Mobile", 8)
игры_бд.добавить_игру("Roblox", "Платформер", "PC", 7)
игры_бд.добавить_игру("Fortnite", "Battle Royale", "PC", 8)
# Показываем все игры
игры_бд.показать_все_игры()
# Отмечаем игру как пройденную
игры_бд.отметить_пройденной("Among Us")
# Показываем лучшие игры
игры_бд.лучшие_игры()
игры_бд.закрыть()
В реальных веб-приложениях базы данных используются повсеместно!
Социальные сети - профили пользователей, посты, комментарии
Интернет-магазины - товары, заказы, клиенты
Игры - достижения игроков, рекорды, настройки
Образовательные платформы - курсы, студенты, оценки
from flask import Flask, render_template, request, redirect
import sqlite3
app = Flask(__name__)
def получить_подключение_бд():
conn = sqlite3.connect('блог.db')
conn.row_factory = sqlite3.Row # Удобный доступ к колонкам
return conn
@app.route('/')
def главная():
conn = получить_подключение_бд()
посты = conn.execute('SELECT * FROM посты ORDER BY дата DESC').fetchall()
conn.close()
return render_template('главная.html', посты=посты)
@app.route('/добавить_пост', methods=['POST'])
def добавить_пост():
заголовок = request.form['заголовок']
содержание = request.form['содержание']
conn = получить_подключение_бд()
conn.execute('''
INSERT INTO посты (заголовок, содержание, дата)
VALUES (?, ?, datetime('now'))
''', (заголовок, содержание))
conn.commit()
conn.close()
return redirect('/')
if __name__ == '__main__':
app.run(debug=True)
Используйте параметризованные запросы - всегда ставьте ? вместо прямой вставки данных
Проверяйте входные данные - убедитесь, что пользователь вводит корректную информацию
Ограничивайте права доступа - не все пользователи должны иметь полный доступ
Делайте резервные копии - регулярно сохраняйте копии важных данных
# ❌ ПЛОХО - уязвимость к SQL-инъекциям
пользователь_ввод = "'; DROP TABLE ученики; --"
cursor.execute(f"SELECT * FROM ученики WHERE имя = '{пользователь_ввод}'")
# ✅ ХОРОШО - безопасный параметризованный запрос
cursor.execute("SELECT * FROM ученики WHERE имя = ?", (пользователь_ввод,))
SQLite - простая, файловая база данных (идеальна для изучения!)
MySQL - популярная система для веб-сайтов
PostgreSQL - мощная система с множеством функций
MongoDB - хранит данные в формате JSON
Firebase - облачная база данных от Google
Redis - быстрая база данных для кэширования
Создайте базу данных для домашней библиотеки:
Таблицы: книги, авторы, жанры
Поля: название, автор, год издания, количество страниц, прочитана
Функции: добавление книги, поиск по автору, список непрочитанных книг
Создайте базу данных для учёта школьных оценок:
Таблицы: ученики, предметы, оценки
Функции: добавление оценки, расчёт среднего балла, поиск лучших учеников
Создайте простую систему блога:
Таблицы: посты, комментарии, авторы
Связи между таблицами (внешние ключи)
Веб-интерфейс для добавления постов и комментариев
Поздравляем! Вы изучили основы работы с базами данных - одну из важнейших тем в программировании. Базы данных используются везде: в мобильных приложениях, веб-сайтах, играх и даже в умных домах!
SQL - язык запросов к базам данных
ORM - инструменты для работы с БД в коде (SQLAlchemy, Django ORM)
NoSQL - альтернативные типы баз данных
Индексы и оптимизация - как сделать базы данных быстрыми
Архитектура данных - как правильно проектировать базы
Помните: данные - это новая нефть! Умение правильно хранить, обрабатывать и анализировать информацию - это суперсила современного программиста. Каждое приложение, которое мы используем, работает с данными. И теперь вы знаете, как это происходит "под капотом"!
Практикуйтесь, экспериментируйте и создавайте собственные проекты с базами данных. Удачи в программировании! 🚀💾