Как начать работу с миграциями в PostgreSQL, используя Alembic внутри Docker контейнера?

Как исправить ошибку, возникающую при первом деплое бота из-за отсутствия таблицы в базе данных, когда пустая БД вызывает ошибку "relation 'Message_ids' does not exist" в результате запуска функции бота?
  • 4 августа 2024 г. 15:03
Ответы на вопрос 3
Для начала работы с миграциями в PostgreSQL с использованием Alembic внутри Docker контейнера, следует выполнить следующие шаги:

1. Убедиться, что у вас есть настроенный Docker контейнер с PostgreSQL.
2. Установить Alembic внутри контейнера, добавив его в файл зависимостей вашего Python проекта.
3. Создать папку для хранения миграций и инициализировать Alembic в этой папке с помощью команды "alembic init migrations".
4. Далее можно создавать миграции с помощью команды "alembic revision --autogenerate -m 'Название миграции'" и применять их к базе данных с помощью команды "alembic upgrade head".

Чтобы исправить ошибку, возникающую при первом деплое бота из-за отсутствия таблицы в базе данных, можно выполнить следующие действия:

1. Убедиться, что все необходимые миграции были применены к базе данных с помощью Alembic.
2. Если таблицы все еще отсутствуют, можно попробовать создать их вручную с помощью SQL запросов или использовать Alembic для создания новой миграции, которая добавит нужные таблицы.
3. После того, как таблицы были созданы, следует запустить функцию бота еще раз и убедиться, что ошибки больше не возникают.

Это поможет исправить ошибку "relation 'Message_ids' does not exist" и запустить функцию бота успешно на пустой базе данных.
Немного отдохнув пришёл к такому решению: 

def morning_routine():
    """
    Delete old message IDs from the DB. Telegram's policy doesn't allow bots
    to delete messages that are older than 48 hours. Wake's up a little bit
    slow, to give the database time to fully load.
    :return: Nothing
    """

    sleep(5)

    session = Session(engine)
    threshold = datetime.now() - timedelta(hours=48)
    stmt = delete(Message).where(
        Message.date_added < threshold.strftime('%Y-%m-%d %H:%M:%S')
    )

    try:
        session.execute(stmt)
        session.commit()
    except ProgrammingError:
        subprocess.run(
            'alembic revision --autogenerate -m "Initial migration"',
            shell=True
        )
        subprocess.run('alembic upgrade head', shell=True)
    finally:
        session.close()


Буду рад конструктивной критике!
Немного отдохнув пришёл к такому решению: 

def morning_routine():
    """
    Delete old message IDs from the DB. Telegram's policy doesn't allow bots
    to delete messages that are older than 48 hours. Wake's up a little bit
    slow, to give the database time to fully load.
    :return: Nothing
    """

    sleep(5)

    session = Session(engine)
    threshold = datetime.now() - timedelta(hours=48)
    stmt = delete(Message).where(
        Message.date_added < threshold.strftime('%Y-%m-%d %H:%M:%S')
    )

    try:
        session.execute(stmt)
        session.commit()
    except ProgrammingError:
        subprocess.run(
            'alembic revision --autogenerate -m "Initial migration"',
            shell=True
        )
        subprocess.run('alembic upgrade head', shell=True)
    finally:
        session.close()


Буду рад конструктивной критике!
Похожие вопросы