Лекция 5: Базы данных
Что такое база данных?
Заголовок раздела «Что такое база данных?»База данных (БД) — организованная совокупность данных, хранящаяся в памяти компьютера.
Реляционные базы данных
Заголовок раздела «Реляционные базы данных»Реляционные базы данных хранят данные в таблицах.
Основные понятия
Заголовок раздела «Основные понятия»Таблица — набор данных в строках и столбцах. Строка — отдельная запись. Столбец — атрибут записи. Первичный ключ (Primary Key) — уникальный идентификатор строки. Внешний ключ (Foreign Key) — ссылка на другую таблицу.
Пример таблицы
Заголовок раздела «Пример таблицы»| id | title | text | source | date |
|---|---|---|---|---|
| 1 | Новости 1 | Текст… | habr | 2024-01-01 |
| 2 | Новости 2 | Текст… | dzen | 2024-01-01 |
SQLite — лёгкая, файловая реляционная база данных.
import sqlite3
# Подключение (создаётся файл, если не существует)conn = sqlite3.connect('news.db')
# Создаём курсорcursor = conn.cursor()
# Создание таблицыcursor.execute(''' CREATE TABLE IF NOT EXISTS news ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, text TEXT, source TEXT, url TEXT, date TEXT, sentiment TEXT )''')
# Сохранение измененийconn.commit()
# Закрытие соединенияconn.close()SQL команды
Заголовок раздела «SQL команды»INSERT — вставка данных
Заголовок раздела «INSERT — вставка данных»cursor.execute(''' INSERT INTO news (title, text, source, url, date) VALUES (?, ?, ?, ?, ?)''', ("Заголовок", "Текст", "habr", "url", "2024-01-01"))
conn.commit()
# Получить id вставленной записиlast_id = cursor.lastrowidSELECT — выборка данных
Заголовок раздела «SELECT — выборка данных»# Все записиcursor.execute('SELECT * FROM news')rows = cursor.fetchall()
# Одна записьcursor.execute('SELECT * FROM news WHERE id = ?', (1,))row = cursor.fetchone()
# С условиемcursor.execute(''' SELECT * FROM news WHERE source = ? AND date >= ?''', ("habr", "2024-01-01"))
# С сортировкойcursor.execute('SELECT * FROM news ORDER BY date DESC LIMIT 10')UPDATE — обновление данных
Заголовок раздела «UPDATE — обновление данных»cursor.execute(''' UPDATE news SET sentiment = ? WHERE id = ?''', ("positive", 1))
conn.commit()DELETE — удаление данных
Заголовок раздела «DELETE — удаление данных»cursor.execute('DELETE FROM news WHERE id = ?', (1,))conn.commit()pandas для работы с данными
Заголовок раздела «pandas для работы с данными»pandas — библиотека для анализа и обработки данных.
import pandas as pdimport sqlite3
# Создание DataFramedata = { 'title': ['Новости 1', 'Новости 2'], 'source': ['habr', 'dzen']}df = pd.DataFrame(data)
# Чтение из SQLiteconn = sqlite3.connect('news.db')df = pd.read_sql('SELECT * FROM news', conn)
# Фильтрацияfiltered = df[df['source'] == 'habr']
# Группировкаgrouped = df.groupby('sentiment').count()
# Статистикаstats = df['sentiment'].value_counts()
# Запись в SQLitedf.to_sql('news_backup', conn, if_exists='replace', index=False)Практика
Заголовок раздела «Практика»Создадим базу для нашего проекта:
import sqlite3
def init_db(db_path='news.db'): """Инициализация базы данных.""" conn = sqlite3.connect(db_path) cursor = conn.cursor()
cursor.execute(''' CREATE TABLE IF NOT EXISTS news ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, text TEXT, source TEXT, url TEXT, date TEXT, sentiment TEXT ) ''')
conn.commit() conn.close() return True
def insert_article(article, db_path='news.db'): """Вставка статьи в базу.""" conn = sqlite3.connect(db_path) cursor = conn.cursor()
cursor.execute(''' INSERT INTO news (title, text, source, url, date) VALUES (?, ?, ?, ?, ?) ''', ( article['title'], article['text'], article['source'], article['url'], article['date'] ))
conn.commit() conn.close() return cursor.lastrowid