Сегодня мы погрузимся в тему установки и настройки SQLAlchemy для работы с фреймворками FastAPI и Django. Мы разберёмся, как подготовить наше приложение к использованию SQLAlchemy, настроить подключения к базам данных и интегрировать этот ORM в проекты.
Прежде чем начать настройку, необходимо установить SQLAlchemy и сопутствующие библиотеки. Мы также разберём важные зависимости, такие как драйверы баз данных, которые будут использоваться для подключения к PostgreSQL или SQLite.
Установка SQLAlchemy и зависимостей
Наиболее простой и стандартный способ установки библиотек в Python — это использование pip. Давайте установим SQLAlchemy и движок базы данных:
pip install sqlalchemy
pip install psycopg2-binary # для PostgreSQL
Если вы планируете использовать SQLite, дополнительный драйвер устанавливать не нужно, поскольку он уже встроен в Python.
👉 Примечание: если вы хотите работать с другой базой данных, вам понадобится соответствующий драйвер, например mysqlclient для MySQL или cx_Oracle для Oracle.
⚡ Настройка SQLAlchemy в FastAPI
FastAPI ценят за его асинхронность. Только вот SQLAlchemy по своей природе синхронна. Чтобы использовать её с FastAPI, мы можем либо работать синхронно, либо добавить библиотеку asyncpg для асинхронного взаимодействия.
Шаг 1: создаём базовый проект FastAPI
Для начала создадим структуру проекта. Если вы ещё не сделали этого, выполните:
pip install fastapi uvicorn
Создадим следующий проект:
my_fastapi_project/
│
├── main.py # Основной файл приложения
├── models.py # Здесь будут описаны модели SQLAlchemy
├── database.py # Подключение к БД и сессии
└── requirements.txt
Шаг 2: настройка подключения к базе данных
Создадим файл database.py для управления подключением к базе данных и сессиями SQLAlchemy:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
DATABASE_URL = "postgresql://user:password@localhost/db_name"
# Создаём движок базы данных
engine = create_engine(DATABASE_URL)
# Создаём фабрику сессий
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Объясним ключевые элементы:
DATABASE_URL— строка подключения к PostgreSQL. Для SQLite строка выглядела бы так:"sqlite:///./test.db".create_engine— определяет движок базы данных.sessionmaker— фабрика для создания соединений (сессий) с базой данных.
Шаг 3: интеграция с FastAPI
Теперь откроем main.py и добавим функцию для управления сессиями SQLAlchemy. Это позволит каждому запросу приложения работать с отдельной сессией:
from fastapi import FastAPI, Depends
from sqlalchemy.orm import Session
from database import SessionLocal
app = FastAPI()
# Зависимость для получения сессии
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.get("/")
def read_root(db: Session = Depends(get_db)):
return {"message": "Welcome to FastAPI with SQLAlchemy"}
Эта зависимость передаёт сессию базы данных в маршруты через Depends.
🧩 Настройка SQLAlchemy в Django
Давайте теперь изучим, как SQLAlchemy можно использовать совместно с Django. Хотя Django имеет свой собственный ORM, бывают случаи, когда нужно подключить SQLAlchemy, например, при работе с внешними базами данных.
Шаг 1: установка Django и SQLAlchemy
Убедитесь, что Django установлен:
pip install django
SQLAlchemy уже установлен, так что двигаться будем дальше. Создайте новый проект Django:
django-admin startproject my_django_project
Шаг 2: интеграция SQLAlchemy
Создайте файл sqlalchemy_integration.py в одном из приложений Django или в директории проекта:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
DATABASE_URL = "postgresql://user:password@localhost/db_name"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Далее создайте хук для возврата сессий SQLAlchemy:
def get_sqlalchemy_session():
session = SessionLocal()
try:
yield session
finally:
session.close()
Теперь мы можем использовать сессии SQLAlchemy в любом месте Django приложения, например, внутри представлений (views.py).
🧪 Пример использования SQLAlchemy в обеих средах
Для завершения настроек реализуем пример с простой моделью User. Начнём с FastAPI:
Создадим модель User в models.py:
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
email = Column(String, unique=True, index=True)
Не забудьте создать таблицы в базе данных:
from database import engine
from models import Base
Base.metadata.create_all(bind=engine)
Добавим эндпоинт для создания пользователей:
@app.post("/users/")
def create_user(name: str, email: str, db: Session = Depends(get_db)):
new_user = User(name=name, email=email)
db.add(new_user)
db.commit()
db.refresh(new_user)
return new_user
В Django подход аналогичный. Определите модель User с помощью SQLAlchemy в любом файле:
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
email = Column(String, unique=True, index=True)
Подключите ту же базу данных PostgreSQL. Создайте экземпляры пользователей через get_sqlalchemy_session, если нужно.
🤔 Часто встречающиеся ошибки и особенности
Работа с SQLAlchemy в FastAPI и Django может сопровождаться ошибками. Например, забудете закрыть сессии, получите ошибку "Too many connections". Использование контекстного менеджера with или зависимостей (Depends) может предотвратить утечки соединений.
Также помните: если вы используете асинхронное взаимодействие в FastAPI, то лучше выбирать библиотеку asyncpg вместо psycopg2.
Теперь у нас есть готовая основа для работы с SQLAlchemy в двух популярных фреймворках. В следующей лекции мы углубимся в создание моделей и узнаем, как описывать структуры таблиц правильно и эффективно.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ