Выполнение миграций
На данный момент в нашем файле env.py используется синхронные команды Alembic для определения и создания экземпляра движка SQLAlchemy, подключения к этому движку и запуска транзакции, а также для правильного вызова движка миграции при запуске команды Alembic. Но так как мы хотим работать с асинхронным драйвером, который будет использовать асинхронные запросы, нам необходимо удалить файл alembic.ini и всю папку migrations
Чтобы создать среду миграции, запустим команду, чтобы создать нашу среду миграции в каталоге app/migrations/.
alembic init -t async app/migrations
Мы используем флаг -t async для асинхронной поддержки.
Чтобы продолжить дальше, настройки в файле alembic.ini должны быть изменены, чтобы Alembic мог работать с нашей БД PostgreSQL. Нам нужно изменить опцию sqlalchemy.url, чтобы она соответствовала строке подключения нашей базы данных:
sqlalchemy.url = postgresql+asyncpg://ecommerce:XXXXXX@localhost:5432/ecommerce
Далее откроем файл env.py в папке migrations и найдем следующую строку:
target_metadata = None
Изменим ее на следующий код:
from app.backend.db import Base
from app.models import category, products
target_metadata = Base.metadata
Мы импортируем класс Base, который мы наследуем от DeclarativeBase, а также наши модели SQLAlchemy.
И теперь мы можем выполнить миграции, чтобы создать в новой базе данных все необходимые таблицы:
alembic revision --autogenerate -m "Initial migration"
В результате получим следующий результат:
(.venv) permin0ff@Mac fastapi_ecommerce % alembic revision --autogenerate -m "Initial tables PostgreSQL"
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected added table 'categories'
INFO [alembic.autogenerate.compare] Detected added index ''ix_categories_id'' on '('id',)'
INFO [alembic.autogenerate.compare] Detected added index ''ix_categories_slug'' on '('slug',)'
INFO [alembic.autogenerate.compare] Detected added table 'products'
INFO [alembic.autogenerate.compare] Detected added index ''ix_products_id'' on '('id',)'
INFO [alembic.autogenerate.compare] Detected added index ''ix_products_slug'' on '('slug',)'
Generating ~/FastAPI_beginners/fastapi_ecommerce/app/migrations/versions/d63bc5937cb6_initial_tables_postgresql.py ... done
И выполним миграции командой alembic upgrade head
(.venv) permin0ff@Mac fastapi_ecommerce % alembic upgrade head
INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> d63bc5937cb6, Initial tables PostgreSQL
И теперь если мы посмотрим наши таблицы в БД, то увидим что они были успешно созданы.
В следующем разделе мы начнем работать с асинхронными запросами.