Установка CLI инструментов и библиотек:
sudo apt update
sudo apt install sqlite3 libsqlite3-devПроверка версии:
sqlite3 --versionБыстрая отладка и проверка данных прямо на сервере.
Подключение:
sqlite3 my_database.dbПолезные dot-команды (внутри оболочки sqlite):
.help -- Помощь
.tables -- Список таблиц
.schema table_name -- Показать CREATE statement таблицы
.mode column -- Читабельный табличный вывод
.headers on -- Показать заголовки столбцов
.quit -- Выход (или Ctrl+D)Дамп и Восстановление (Backup):
# Создать дамп (SQL файл)
sqlite3 my_database.db .dump > backup.sql
# Восстановить из дампа
sqlite3 new_database.db < backup.sqlМинимальный рабочий пример (Vanilla Python).
import sqlite3
# 1. Подключение (файл создастся сам, если его нет)
conn = sqlite3.connect('server_db.sqlite')
cursor = conn.cursor()
# 2. Создание таблицы
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
email TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
# 3. Вставка (ВНИМАНИЕ: Используйте `?` для защиты от SQL Injection)
user_data = ('backend_dev', 'dev@server.com')
cursor.execute('INSERT INTO users (username, email) VALUES (?, ?)', user_data)
# 4. Фиксация изменений
conn.commit()
# 5. Чтение
cursor.execute('SELECT * FROM users WHERE username = ?', ('backend_dev',))
row = cursor.fetchone()
print(row) # Вывод: (1, 'backend_dev', 'dev@server.com', '2023-10-27...')
# 6. Закрытие
conn.close()Автоматический commit (при успехе) или rollback (при ошибке) + автозакрытие.
import sqlite3
db_path = 'server_db.sqlite'
try:
with sqlite3.connect(db_path) as conn:
cursor = conn.cursor()
# Множественная вставка (Bulk Insert) — намного быстрее цикла!
users = [('user1', 'm1@test.com'), ('user2', 'm2@test.com')]
cursor.executemany('INSERT INTO users (username, email) VALUES (?, ?)', users)
# Commit делается автоматически при выходе из блока
except sqlite3.Error as e:
print(f"Ошибка БД: {e}")По умолчанию возвращает кортежи (tuple). Для API удобнее словари.
def get_db_connection():
conn = sqlite3.connect('server_db.sqlite')
# Позволяет обращаться к полям по имени
conn.row_factory = sqlite3.Row
return conn
with get_db_connection() as conn:
row = conn.execute('SELECT * FROM users LIMIT 1').fetchone()
# Теперь можно так:
print(row['email'])
print(dict(row)) # {'id': 1, 'username': 'user1', ...}SQLite по умолчанию настроен на совместимость, а не на скорость. Для сервера обязательно включите WAL.
Позволяет параллельное чтение во время записи.
SQL:
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL; -- Баланс между скоростью и сохранностьюPython:
conn = sqlite3.connect('server_db.sqlite')
conn.execute('PRAGMA journal_mode = WAL;')
conn.execute('PRAGMA synchronous = NORMAL;')Без индексов SELECT на больших данных "уложит" CPU.
CREATE INDEX idx_users_email ON users(email);| SQLite Storage Class | Python Type |
|---|---|
NULL |
None |
INTEGER |
int |
REAL |
float |
TEXT |
str |
BLOB |
bytes |
Примечание: SQLite не имеет типа DATETIME. Даты хранятся как строки (TEXT) или timestamp (INTEGER/REAL).
Очистка старых логов (пример обслуживания базы):
#!/bin/bash
DB_PATH="/var/www/app/data.db"
sqlite3 $DB_PATH "DELETE FROM logs WHERE created_at < date('now', '-30 days');"
sqlite3 $DB_PATH "VACUUM;" # Сжатие файла базы после удаления данных