2.8 KiB
FastAPI + SQLModel + Alembic
Following the https://testdriven.io/blog/fastapi-sqlmodel/ blog post
Docker Containers
Bring it up
docker-compose up -d --build
NOTE changes in your are reflected in the web container since we are mounting it as a local volume, and we are serving it using uvicorn from the target mount.
volumes:
- ./project:/usr/src/app
Shut it down
docker-compose down -v
The -v removes names volumes declared in the volumes
section of the compose
file and anonymous volumes attached to containers
Logs
docker-compose logs web
You'll see what is logged to stdout. Should include your new models on startup.
or
docker-compose logs db
PSQL for working in your DB
docker-compose exec db psql --username=postgres --dbname=foo
foo=# \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | song | table | postgres
Running Alembic code
See: https://alembic.sqlalchemy.org/en/latest/cookbook.html#using-asyncio-with-alembic
Init Alembic
Creates the initial needfuls from alembic. Run it in our container because we don't have a local env. We initialize it with the async template also
docker-compose exec web alembic init -t async migrations
Note we had to modify a lot of the generated code from the above command for this to work with SQLModel and the models it produces.
First Migration
docker-compose exec web alembic revision --autogenerate -m "init"
As second migration example
IMPORTANT
The --autogenerate
works off of inspecting the running DB schema against your code
to see if anything is going to change. Your DB needs to be running to generate these
autogenerated changes. Or you could just write your own file by hand. Which could
happen in more complicated applications.
docker-compose exec web alembic revision --autogenerate -m "add year to Song Model"
Applying the Migrations
docker-compose exec web alembic upgrade head
If we wanted to get ambitious we could use an entrypoint script that will run alembic migrations for us on container start. You did this in your Wagtail tutorial stuff.
Interactions with API
Add a song
curl -d '{"name":"Midnight Fit", "artist":"Mogwai"}' \
-H "Content-Type: application/json" -X POST http://localhost:8004/songs
Response:
{"id":1,"artist":"Mogwai","name":"Midnight Fit"}%
With the new optional song year
curl -d '{"name":"Midnight Fit", "artist":"Mogwai", "year": 2021}' \
-H "Content-Type: application/json" -X POST http://localhost:8004/songs
Response:
{"id":2,"name":"Snakes","artist":"Miyavi","year":2021}
Sources Root in Pycharm
I marked "project" directory as the "Sources Root". PyCharm uses the source roots as the starting point for resolving imports.