Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Введение и установка
01_intro_setup

Введение и установка

Экосистема SQLAlchemy, версия 2.0+, настройка окружения, первое подключение

Введение и установка

SQLAlchemy — это не просто ORM. Это полный toolkit для работы с базами данных в Python, сочетающий гибкость SQL с выразительностью Python.

#Что такое SQLAlchemy?

SQLAlchemy — это библиотека уровня enterprise для работы с реляционными базами данных в Python. Она предоставляет:

  1. Core — низкоуровневый API для работы с SQL (таблицы, запросы, соединения)
  2. ORM — высокоуровневый API для работы с объектами Python

#Версия 2.0: революционные изменения

SQLAlchemy 2.0 (выпущена в 2023) принесла фундаментальные изменения:

# SQLAlchemy 1.x (старый стиль, legacy) session.query(User).filter_by(name='Alice').all() # SQLAlchemy 2.0+ (современный стиль) from sqlalchemy import select session.execute(select(User).where(User.name == 'Alice')).scalars().all()

Ключевые изменения 2.0:

  • Единый стиль запросов через select() (Core и ORM объединены)
  • Полная поддержка type hints и mypy
  • Улучшенная производительность
  • Явное указание типов для колонок
  • Современный async API

#Установка

#Базовая установка

# Минимальная установка (только Core + ORM) pip install sqlalchemy # С psycopg для PostgreSQL (рекомендуется) pip install sqlalchemy psycopg[binary] # Или через poetry poetry add sqlalchemy psycopg[binary]

#Для асинхронной работы

# asyncpg для PostgreSQL (самый быстрый драйвер) pip install sqlalchemy asyncpg # Или aiomysql для MySQL pip install sqlalchemy aiomysql

#Полная установка для разработки

# Все зависимости для курса poetry add sqlalchemy psycopg[binary] asyncpg alembic pydantic pytest pytest-asyncio # Alembic часто устанавливается отдельно poetry add alembic

#Первое подключение

#Создание Engine

Engine — это центральный объект SQLAlchemy. Он управляет:

  • Подключением к базе данных
  • Пулом соединений (connection pool)
  • Выполнением запросов
from sqlalchemy import create_engine # PostgreSQL через psycopg engine = create_engine( 'postgresql+psycopg://user:password@localhost:5432/mydb', echo=True, # Логирование SQL (для отладки) pool_size=10, # Размер пула соединений max_overflow=20, # Дополнительные соединения при пике pool_recycle=3600, # Пересоздавать соединения через час ) # SQLite (для тестов и прототипов) engine = create_engine('sqlite:///mydb.sqlite', echo=True) # PostgreSQL async (asyncpg) from sqlalchemy.ext.asyncio import create_async_engine async_engine = create_async_engine( 'postgresql+asyncpg://user:password@localhost:5432/mydb', echo=True, )

#URL подключения

Формат URL:

dialect+driver://username:password@host:port/database
База данныхURL
PostgreSQL (psycopg)postgresql+psycopg://user:pass@localhost/db
PostgreSQL (asyncpg)postgresql+asyncpg://user:pass@localhost/db
MySQLmysql+pymysql://user:pass@localhost/db
SQLitesqlite:///path/to/file.db
SQLite (in-memory)sqlite:///:memory:

#Переменные окружения

Никогда не храните пароли в коде! Используйте .env:

# .env DATABASE_URL=postgresql+psycopg://user:pass@localhost:5432/mydb DATABASE_POOL_SIZE=10
import os from dotenv import load_dotenv load_dotenv() engine = create_engine( os.getenv('DATABASE_URL'), pool_size=int(os.getenv('DATABASE_POOL_SIZE', 10)), )

#Проверка подключения

from sqlalchemy import text # Простое подключение with engine.connect() as conn: result = conn.execute(text('SELECT 1')) print(result.scalar()) # 1 # Транзакция (автоматический rollback) with engine.begin() as conn: conn.execute(text('INSERT INTO logs (message) VALUES (:msg)'), {'msg': 'Test'}) # commit при выходе из блока

#Экосистема SQLAlchemy

┌─────────────────────────────────────────────────┐
│           SQLAlchemy 2.0+                       │
├─────────────────────────────────────────────────┤
│  ORM (Declarative)  │  Core (Table, select())   │
├─────────────────────────────────────────────────┤
│              Dialect Layer                      │
│  (postgresql, mysql, sqlite, oracle, ...)       │
├─────────────────────────────────────────────────┤
│              DBAPI Drivers                      │
│  psycopg, asyncpg, pymysql, aiomysql, ...       │
└─────────────────────────────────────────────────┘

#Связанные инструменты

ИнструментНазначение
AlembicМиграции схемы БД
Greenletrequired для async (устанавливается автоматически)
psycopgPostgreSQL драйвер (синхронный)
asyncpgPostgreSQL драйвер (асинхронный, самый быстрый)

#Best Practices

#✅ Делайте

# Используйте context manager для сессий from sqlalchemy.orm import Session with Session(engine) as session: # работа с сессией session.commit() # или rollback при ошибке # Используйте параметры подключения engine = create_engine( url, pool_pre_ping=True, # Проверка соединения перед использованием pool_recycle=3600, # Пересоздание через час ) # Закрывайте engine при завершении приложения engine.dispose()

#❌ Не делайте

# Не создавайте engine для каждого запроса engine = create_engine(url) # ПЛОХО: нет пула # Не храните пароли в коде engine = create_engine('postgresql://admin:secret123@localhost/db') # ПЛОХО # Не забывайте закрывать сессии session = Session(engine) session.query(...) # ПЛОХО: нет context manager

#Подготовка к следующей теме

Установите PostgreSQL локально или используйте Docker:

docker run --rm -d \ -e POSTGRES_USER=postgres \ -e POSTGRES_PASSWORD=postgres \ -e POSTGRES_DB=testdb \ -p 5432:5432 \ postgres:15

Проверьте подключение:

from sqlalchemy import create_engine, text engine = create_engine('postgresql+psycopg://postgres:postgres@localhost:5432/testdb') with engine.connect() as conn: result = conn.execute(text('SELECT version()')) print(result.scalar())

Далее: SQLAlchemy Core