Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
К какой группе БД относится SQLite
SQLite — это встроенная (embedded) реляционная база данных, которая относится к группе встроенных (embedded) СУБД с файловым хранилищем. Давайте разберёмся в классификации БД и особенностях SQLite.
Классификация БД и место SQLite
По архитектуре:
1. Встроенные (Embedded) БД
- SQLite, LevelDB, RocksDB
- Работают как библиотека в приложении
- Нет отдельного сервера
- Данные хранятся в одном файле (обычно)
2. Клиент-серверные БД
- PostgreSQL, MySQL, Oracle
- Отдельный процесс-сервер
- Сетевое взаимодействие
- Несколько клиентов могут работать одновременно
# Встроенная БД (SQLite)
import sqlite3
conn = sqlite3.connect('database.db') # Прямое подключение к файлу
cursor = conn.cursor()
cursor.execute('CREATE TABLE users (id INTEGER, name TEXT)')
conn.commit()
# Клиент-серверная БД (PostgreSQL)
import psycopg2
conn = psycopg2.connect(
host='localhost',
port=5432,
database='mydb',
user='postgres',
password='password'
) # Подключение через сеть
По типу хранилища:
1. Файловые (File-based)
- SQLite
- BerkeleyDB
- Access
- Данные хранятся в файлах на диске
2. Сетевые (Network-based)
- PostgreSQL, MySQL, Oracle, MongoDB
- Данные хранятся на сервере
- Доступ через сеть
3. In-Memory (оперативная память)
- SQLite (с параметром
:memory:) - Redis
- Memcached
- Очень быстрые, но данные теряются при отключении
import sqlite3
# Файловая БД
conn_file = sqlite3.connect('my_database.db')
# In-memory БД (только для текущей сессии)
conn_memory = sqlite3.connect(':memory:')
# Временная БД
conn_temp = sqlite3.connect('') # Автоматически удаляется при закрытии
Характеристики SQLite
import sqlite3
import os
# Проверка версии
print(sqlite3.sqlite_version) # Версия SQLite
print(sqlite3.version) # Версия python-sqlite3
# Информация о БД
conn = sqlite3.connect('test.db')
print(os.path.getsize('test.db')) # Размер файла БД
# SQLite имеет динамическую типизацию
conn.execute('CREATE TABLE dynamic (id, value, data)')
conn.execute('INSERT INTO dynamic VALUES (1, "text", 100)')
conn.execute('INSERT INTO dynamic VALUES (2, 999, "string")')
results = conn.execute('SELECT * FROM dynamic').fetchall()
print(results) # Может хранить разные типы в одном столбце
Основные характеристики SQLite:
| Характеристика | Значение |
|---|---|
| Архитектура | Встроенная (embedded) |
| Хранилище | Файловое (.db) |
| Доступ | Синхронный, из приложения |
| Тип БД | Реляционная |
| Типизация | Динамическая |
| Многопользовательский доступ | Ограниченный (file-level locking) |
| Потокобезопасность | Ограниченная |
| Размер БД | До 140 Тб (теоретически) |
| Язык запросов | SQL |
| ACID | Да |
| Лицензия | Public Domain (открытый исходный код) |
Примеры использования SQLite
import sqlite3
from datetime import datetime
class UserRepository:
def __init__(self, db_path='users.db'):
self.conn = sqlite3.connect(db_path)
self.conn.row_factory = sqlite3.Row # Возвращает строки как словари
self._init_db()
def _init_db(self):
"""Инициализация БД"""
self.conn.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
self.conn.commit()
def add_user(self, name, email):
"""Добавить пользователя"""
cursor = self.conn.cursor()
cursor.execute(
'INSERT INTO users (name, email) VALUES (?, ?)',
(name, email)
)
self.conn.commit()
return cursor.lastrowid
def get_user(self, user_id):
"""Получить пользователя"""
cursor = self.conn.cursor()
cursor.execute('SELECT * FROM users WHERE id = ?', (user_id,))
return dict(cursor.fetchone() or {})
def list_users(self):
"""Получить всех пользователей"""
cursor = self.conn.cursor()
cursor.execute('SELECT * FROM users ORDER BY created_at DESC')
return [dict(row) for row in cursor.fetchall()]
def close(self):
self.conn.close()
# Использование
repo = UserRepository()
user_id = repo.add_user('John Doe', 'john@example.com')
user = repo.get_user(user_id)
print(user)
repo.close()
Когда использовать SQLite
✓ Используй SQLite для:
- Мобильных приложений (iOS, Android)
- Настольных приложений (Electron, PyQt)
- Локальных утилит и скриптов
- Прототипирования и тестирования
- Кэширования данных
- Небольших приложений (< 100k одновременных пользователей)
- Single-machine applications
# Пример: Приложение для отслеживания задач
import sqlite3
conn = sqlite3.connect(':memory:') # Для демонстрации используем in-memory
conn.execute('''
CREATE TABLE tasks (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
completed BOOLEAN DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
# Добавляем задачи
conn.execute("INSERT INTO tasks (title) VALUES ('Buy groceries')")
conn.execute("INSERT INTO tasks (title) VALUES ('Write report')")
conn.commit()
# Запрашиваем задачи
tasks = conn.execute('SELECT * FROM tasks WHERE completed = 0').fetchall()
print(tasks)
✗ НЕ используй SQLite для:
- Веб-приложений с множеством одновременных пользователей
- Приложений с интенсивной записью данных
- Распределённых систем
- Требований к масштабируемости на несколько серверов
- Высоконагруженных систем
Альтернативы и сравнение
| SQLite | PostgreSQL | MySQL | MongoDB
|————————|————————————|———————|—————————
Тип | File | Network | Network | NoSQL
Множество | 1 | Много | Много | Много
пользователей
Производ. | Высокая| Средняя | Средняя | Высокая
Масштабл. | Низкая | Высокая | Высокая | Высокая
SQLAlchemy | ✓ | ✓ | ✓ | Через
SQLAlchemy
Вывод
SQLite — это встроенная файловая реляционная СУБД, идеальная для локальных приложений и прототипирования. Её главные преимущества: простота использования, отсутствие необходимости в сервере и полная поддержка SQL. Это делает её первым выбором для мобильных приложений, настольных утилит и приложений, где не требуется масштабируемость.