Перейти к содержанию

Использование миграций в Python — SQLAlchemy с решением Alembic

Всех приветствую Камрады! Довольно часто сейчас приходиться что-то программировать на python, а точнее г**нокодить и вот познакомился я с чудесной библиотекой SQLAlchemy – это Python-библиотека, которая позволяет работать с реляционными базами данных с помощью ORM, а Alembic – это инструмент для работы с миграциями для SQLAlchemy.

Что такое миграции?

Основная идея миграции заключается в программном применении изменений в базе данных. Инструменты миграции создают артефакты, которые проверяют структуру базы данных с помощью исходного кода и последовательно запускают ее для применения изменений.

Миграция базы данных использует ту же идею, что и системы контроля версий, для создания истории изменений в структуре базы данных, предоставляя возможность применять и отменять эти изменения.

То есть в любой момент мы можем откатить либо добавить нам то что нужно.

Для начала установим их через pip

pip install psycopg2-binary sqlalchemy alembic
import datetime
from sqlite3 import Date
from sqlalchemy import  BigInteger, Column, DateTime, Float, ForeignKey, Integer, String, Table, create_engine, insert, select,update, text, Connection, MetaData
from sqlalchemy.orm import registry,Mapped,sessionmaker, declarative_base,relationship,as_declarative,Session,DeclarativeBase, mapped_column, session
engine = create_engine("postgresql+psycopg2://test:test@localhost/test", echo=True)


class Base(DeclarativeBase): pass

class Users(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True, index=True)
    fullname = Column(String)
    id_telegram = Column(BigInteger)
    date = Column(DateTime,nullable=False)

# Base.metadata.create_all(bind=engine)


with Session(autoflush=False, bind=engine) as session:
    
    current_datetime = datetime.datetime.now()

    user = Users(fullname='Nik Pidorasovich',id_telegram=15623123 ,date=current_datetime)
    session.add(user)
    session.commit()
    print(user.id)
    print(current_datetime)

  

Создаем файл main.py с таким содержанием, объяснения я думаю излишнее

Для работы Alembic требуется несколько файлов. Чтобы инициализировать Alembic для вашего проекта, введите команду ниже:

alembic init migrations

Нам требуются два файла всего это alembic.ini и env.py

Для начала добавим подключение к базе данных в файле alembic.ini

sqlalchemy.url = postgresql+psycopg2://test:test@localhost/test

Дальше иде в migrations/env.py добавляем там нашу модель

target_metadata = Base.metadata

Автогенерация миграций

Теперь мы готовы настроить нашу первую миграцию. Используйте рекомендации ниже для автоматического создания первоначальных миграций:

alembic revision --autogenerate -m "Create migrations"

После выполнения у нас появиться миграция в vresions, конечно у меня их прям много но у вас он будет один )

После создания миграции мы можем выполнить миграцию в базе данных, запустив команду

alembic upgrade head

Теперь в нашей базе данных появилась наша созданная таблица

Полезные команды

  • Отображение текущей версии базы данных: alembic current.
  • Просмотр истории миграций: alembic history --verbose.
  • Отменить все миграции: alembic downgrade base.
  • Отмените миграцию одну за другой: alembic downgrade -1.
  • Примените все миграции: alembic upgrade head.
  • Примените миграции одну за другой: alembic upgrade +1.
  • Отобразить весь необработанный SQL: alembic upgrade head --sql.
  • Сброс базы данных: alembic downgrade base && alembic upgrade head.

Как добавить или удалить колонку

Вот кстати довольно интересный вопрос и довольно интересное решение в alembic, нам нужно зайти в нашу миграцию

И в функции upgrade написать

op.add_column('users', sa.Column('date',sa.DateTime(),nullable=True ))

Немного проясню users наша таблица в которую мы хотим добавить колонку date колонку которую мы хоти добавить, дальше в водим команду

alembic upgrade f5cf8b9fbc37 

И теперь у нас в базе данных появилась колонка date, с удаление принцип похож только мы добавляем в функцию downgrade

op.drop_column('users', 'fullname')

Вот и все )

Опубликовано в рубрикеUncategorizedПрограммирование

Оставьте первый коментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *