Перейти к содержимому

Лекция 5: Базы данных

База данных (БД) — организованная совокупность данных, хранящаяся в памяти компьютера.

Реляционные базы данных хранят данные в таблицах.

Таблица — набор данных в строках и столбцах. Строка — отдельная запись. Столбец — атрибут записи. Первичный ключ (Primary Key) — уникальный идентификатор строки. Внешний ключ (Foreign Key) — ссылка на другую таблицу.

idtitletextsourcedate
1Новости 1Текст…habr2024-01-01
2Новости 2Текст…dzen2024-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()
cursor.execute('''
INSERT INTO news (title, text, source, url, date)
VALUES (?, ?, ?, ?, ?)
''', ("Заголовок", "Текст", "habr", "url", "2024-01-01"))
conn.commit()
# Получить id вставленной записи
last_id = cursor.lastrowid
# Все записи
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')
cursor.execute('''
UPDATE news
SET sentiment = ?
WHERE id = ?
''', ("positive", 1))
conn.commit()
cursor.execute('DELETE FROM news WHERE id = ?', (1,))
conn.commit()

pandas — библиотека для анализа и обработки данных.

import pandas as pd
import sqlite3
# Создание DataFrame
data = {
'title': ['Новости 1', 'Новости 2'],
'source': ['habr', 'dzen']
}
df = pd.DataFrame(data)
# Чтение из SQLite
conn = 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()
# Запись в SQLite
df.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