Справочник Python

Полное руководство по языку на русском

Базы данных

SQLite (встроенная БД)

import sqlite3  # импорт модуля для SQLite

# Подключение (создаст файл, если нет)
conn = sqlite3.connect("database.db")  # подключение к базе данных
cursor = conn.cursor()  # присваивание

# Создание таблицы
cursor.execute("""  # выполнение SQL-запроса
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER,
        email TEXT UNIQUE
    )
""")

# Вставка
cursor.execute(  # выполнение SQL-запроса
    "INSERT INTO users (name, age, email) VALUES (?, ?, ?)",
    ("Анна", 30, "anna@example.com")
)
conn.commit()  # фиксация транзакции

# Чтение
cursor.execute("SELECT * FROM users WHERE age > ?", (18,))  # выполнение SQL-запроса
rows = cursor.fetchall()  # все строки результата
for row in rows:  # цикл по элементам
    print(row)  # вывод в консоль

# Одна строка
row = cursor.fetchone()  # одна строка результата

# Закрытие
conn.close()  # закрытие соединения

Контекстный менеджер

with sqlite3.connect("database.db") as conn:  # контекстный менеджер
    cursor = conn.cursor()  # присваивание
    cursor.execute("SELECT * FROM users")  # выполнение SQL-запроса
    rows = cursor.fetchall()  # все строки результата
    # conn.commit() — авто commit при выходе из with

# row_factory — доступ по имени колонки
conn = sqlite3.connect("database.db")  # подключение к базе данных
conn.row_factory = sqlite3.Row  # доступ к строке по имени колонки
cursor = conn.cursor()  # присваивание
cursor.execute("SELECT * FROM users")  # выполнение SQL-запроса
row = cursor.fetchone()  # одна строка результата
print(row["name"])  # вывод в консоль

Транзакции

try:  # начало блока с обработкой исключений
    cursor.execute("BEGIN")  # выполнение SQL-запроса
    cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1")  # выполнение SQL-запроса
    cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE id = 2")  # выполнение SQL-запроса
    conn.commit()  # фиксация транзакции
except Exception:  # обработка исключения
    conn.rollback()  # откат транзакции
    print("Транзакция откачена")  # вывод в консоль

Сырой SQL vs ORM

Для работы с БД в Python часто используют ORM:

  • SQLAlchemy — мощный ORM с полным контролем
  • Django ORM — встроен в Django, удобен для веб-приложений
  • Peewee — лёгкий ORM для небольших проектов
# SQLAlchemy (пример)
from sqlalchemy import create_engine, Column, Integer, String  # импорт модуля
from sqlalchemy.orm import declarative_base, Session  # импорт модуля

Base = declarative_base()  # присваивание

class User(Base):
    __tablename__ = "users"  # строковое значение
    id = Column(Integer, primary_key=True)  # присваивание
    name = Column(String)  # присваивание
    age = Column(Integer)  # присваивание

engine = create_engine("sqlite:///database.db")  # присваивание
Base.metadata.create_all(engine)

with Session(engine) as session:  # контекстный менеджер
    user = User(name="Анна", age=30)  # присваивание
    session.add(user)
    session.commit()