sqlite3 — Интерфейс для баз данных SQLite
SQLite — это встроенная легковесная база данных, сохраняемая в один файл. Ей не нужен отдельный серверный процесс.
import sqlite3
Базовое подключение и курсор
import sqlite3
# Подключение к файлу (создастся, если не существует)
con = sqlite3.connect("app.db")
# Можно использовать базу данных в оперативной памяти
# con = sqlite3.connect(":memory:")
# Создание курсора для выполнения запросов
cur = con.cursor()
Создание таблиц и защита от инъекций
Важно: Никогда не используйте f-строки для подстановки переменных в SQL-запрос. Это приводит к уязвимости SQL Injection. Используйте знак
?.
cur.execute("""
CREATE TABLE users (
id INTEGER PRIMARY KEY,
username TEXT NOT NULL,
age INTEGER
)
""")
# Безопасная подстановка переменных
username = "alice"
age = 30
cur.execute("INSERT INTO users (username, age) VALUES (?, ?)", (username, age))
# Множественная вставка
users_data = [("bob", 25), ("charlie", 35)]
cur.executemany("INSERT INTO users (username, age) VALUES (?, ?)", users_data)
# Сохранение изменений!
con.commit()
Чтение данных
# Получение одной строки
cur.execute("SELECT username FROM users WHERE age > ?", (28,))
row = cur.fetchone()
print(row) # ('alice',)
# Получение всех строк
cur.execute("SELECT * FROM users")
print(cur.fetchall())
# Итерация по курсору
for row in cur.execute("SELECT username FROM users"):
print(row[0])
# Закрытие соединения
con.close()
Контекстные менеджеры
Блок with con: автоматически делает commit() при успехе или rollback() при ошибке.
con = sqlite3.connect("app.db")
try:
with con:
con.execute("INSERT INTO users (username) VALUES ('dave')")
finally:
con.close()
Доступ по именам столбцов
con = sqlite3.connect("app.db")
con.row_factory = sqlite3.Row # Включаем поведение как у словарей
cur = con.cursor()
cur.execute("SELECT * FROM users LIMIT 1")
user = cur.fetchone()
print(user['username']) # Доступ по имени столбца
print(user[1]) # Доступ по индексу также работает
Официальная документация
sqlite3 — DB-API 2.0 interface for SQLite databases
Полный справочник API (API Reference)
Объект Connection (Подключение)
| Метод | Описание |
|---|---|
sqlite3.connect(database) |
Подключается к БД (или создает её, если нет) и возвращает объект соединения. |
Connection.cursor() |
Создает и возвращает объект курсора для управления запросами. |
Connection.commit() |
Сохраняет в файл изменения, которые были внесены запросами INSERT, UPDATE, DELETE. Без коммита данные сотрутся при закрытии скрипта! |
Connection.rollback() |
Откатывает базу к состоянию до текущих несохраненных изменений. |
Connection.close() |
Безопасно закрывает файл базы данных. |
Объект Cursor (Курсор)
| Метод | Описание |
|---|---|
Cursor.execute(sql, [params]) |
Выполняет один SQL запрос. Для подстановки безопасных переменных в SQL используйте знак ?. |
Cursor.executemany(sql, params_list) |
Применяет один и тот же SQL-запрос ко всему массиву данных. (Супер-быстрая массовая вставка). |
Cursor.fetchone() |
Достает одну (следующую) строку из результатов запроса SELECT. |
Cursor.fetchall() |
Достает ВСЕ строки сразу из результата запроса SELECT в виде списка кортежей. |