⚡ Шпаргалка
# Установка
pip install SQLAlchemy
pip install pymysql # если нужен MySQL
# Строки подключения
'postgresql://user:password@localhost:5432/mydatabase'
'mysql+pymysql://user:password@localhost:3306/mydatabase'
'sqlite:///path/to/database.db'
'sqlite:///:memory:'
# Движок
from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:')
# Создание сессии (современный стиль 2.x)
from sqlalchemy.orm import Session
with Session(engine) as session:
session.add(obj)
session.commit()
# Создание таблиц
Base.metadata.create_all(engine)
# Логирование
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('sqlalchemy.engine')
logger.setLevel(logging.INFO)
Установка
pip install SQLAlchemy
# Для MySQL дополнительно нужна библиотека-драйвер
pip install pymysql
Строки подключения (Connection String)
Шаблон: '<DBMS>+<library>://<user>:<password>@<host>:<port>/<database>'
| СУБД | Пример строки подключения |
| PostgreSQL |
'postgresql://user:password@localhost:5432/mydatabase' |
| MySQL |
'mysql+pymysql://user:password@localhost:3306/mydatabase' |
| SQLite (файл) |
'sqlite:///path/to/database.db' |
| SQLite (память) |
'sqlite:///:memory:' |
| Часть строки | Описание | Пример |
<DBMS>+<library> | СУБД и библиотека-драйвер | mysql+pymysql |
<user> | Имя пользователя | root |
<password> | Пароль пользователя | secret |
<host> | Адрес сервера | localhost |
<port> | Порт СУБД (MySQL — 3306) | 3306 |
<database> | Название базы данных | mydatabase |
create_engine — создание движка
from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:')
| Параметр | Тип | Описание |
| первый аргумент (url) | str | Строка подключения |
echo | bool | Выводить SQL-запросы в консоль (для отладки) |
sessionmaker — фабрика сессий (стиль лекции 1.x)
from sqlalchemy.orm import sessionmaker
# Создать фабрику сессий
Session = sessionmaker(bind=engine)
# Создать экземпляр сессии
session = Session()
Session — операции с данными (2.x)
from sqlalchemy.orm import Session
with Session(engine) as session:
session.add(obj) # добавить объект
session.commit() # зафиксировать в БД
| Метод | Описание |
session.add(obj) | Добавить объект в сессию (Transient → Pending) |
session.commit() | Зафиксировать изменения в БД (Pending → Persistent) |
session.rollback() | Откатить незафиксированные изменения |
session.close() | Закрыть сессию (объекты → Detached) |
session.delete(obj) | Пометить объект для удаления (→ Deleted) |
Base.metadata.create_all — создание таблиц
# Создать все таблицы, описанные в подклассах Base
Base.metadata.create_all(engine)
Вызывается после объявления всех моделей, до начала работы с сессией. Если таблица уже существует — ничего не происходит.
Состояния объекта в сессии
| Состояние | Описание |
| Transient | Объект создан, но не связан с сессией |
| Pending | Объект добавлен в сессию через add(), но ещё не сохранён в БД |
| Persistent | Объект сохранён в БД и находится под управлением сессии |
| Detached | Объект был в сессии, но сейчас отсоединён от неё (после close) |
| Deleted | Объект удалён из БД в рамках текущей сессии |
Логирование (модуль logging)
import logging
# Настройка базового логирования
logging.basicConfig(level=logging.INFO)
# Логгер для SQL-запросов SQLAlchemy
logger = logging.getLogger('sqlalchemy.engine')
# Включить логирование SQL-запросов
logger.setLevel(logging.INFO)
Declarative ORM 2.x — объявление моделей
Современный стиль (рекомендуется в новых проектах):
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy import String, Integer
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(30))
age: Mapped[int] = mapped_column(Integer)
| Тип SQLAlchemy | Python тип | SQL тип |
Integer | int | INTEGER |
String(N) | str | VARCHAR(N) |
Float | float | REAL |
Boolean | bool | BOOLEAN |
Numeric(p,s) | Decimal | NUMERIC |