mascai
mascai

Reputation: 1872

Proper way to integrate alembic and sqlalchemy in fastapi application

I am building a fastAPI + sqlalchemy + alembic + docker-compose reusable template. Full source code: https://github.com/mascai/fastapi_template (commit 77ce7f2)

The project is working but I worry about alembic integration:

I have to import users (orm model) in the init.py file, alembic doesn't see changes in the user model without this import:

# app/models/__init__.py

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
from . import users # IMPORTANT: intended to register models for alembic (should be at the end of the file), alembic revision --autogenerate -m "migration name"

What is the proper way to link sqlalchemy and alembic in my code?

Project tree:

├── app
│   ├── Dockerfile
│   ├── __init__.py
│   ├── alembic
│   │   ├── README
│   │   ├── env.py
│   │   ├── script.py.mako
│   │   └── versions
│   │       └── 486ef6640756_initial_commit.py
│   ├── alembic.ini
│   ├── api
│   │   └── v1
│   │       ├── __init__.py
│   │       └── users.py
│   ├── database
│   │   ├── __init__.py
│   │   └── session.py
│   ├── main.py
│   ├── models
│   │   ├── __init__.py
│   │   └── users.py
│   ├── requirements.txt
│   ├── schemas
│   │   ├── __init__.py
│   │   └── users.py
│   └── utils
│       └── __init__.py
├── docker-compose.yaml

Alembic settings:

# /app/alembic/env.py
from logging.config import fileConfig

from sqlalchemy import engine_from_config
from sqlalchemy import pool

from alembic import context

# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config

# Interpret the config file for Python logging.
# This line sets up loggers basically.
if config.config_file_name is not None:
    fileConfig(config.config_file_name)

# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
from app.models import Base
target_metadata = Base.metadata

from app.database.session import DATABASE_URL
config.set_main_option('sqlalchemy.url', DATABASE_URL)
...

Second part of the question:

Also I am creating and applying migrations like this. Is it the best way to apply migrations? (docker exec -ti looks bulky in my actions)

# login into docker container
docker exec -ti conatiner_name bash
alembic revision --autogenerate -m "migration name"
alembic upgrade head

Upvotes: 0

Views: 136

Answers (0)

Related Questions