SQLAlchemy: как добавить столбец в существующую таблицу?

#python #flask #sqlalchemy #flask-sqlalchemy

#python #flask #sqlalchemy #flask-sqlalchemy

Вопрос:

Я пытаюсь добавить поле или столбец в существующую таблицу с помощью SQLAchemy.

Ниже приведен класс table

 class ReleaseVersion(Base):

    __tablename__ = 'versions'

    id = Column(Integer, primary_key=True, autoincrement=True)
    release = Column(String(128), nullable=False, unique=True)


    def __init__(self,release, id=None):

        if(id):
            self.id = id

        self.release = release
  

Я инициализировал таблицу, используя следующую строку

 myDB.ReleaseVersion.__table__.create(bind=self.engine, checkfirst=True)
  

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

Должен ли я вручную создать поле в таблице и обновить класс? В качестве альтернативы, добавьте поле в класс table и добавьте столбец, если он не существует в функции инициализации?

Ответ №1:

TL; DR

Установите flask-migrate с pip или в вашем requirements.txt , затем, как только вы добавите свой новый столбец в свои модели:

 flask db init
flask db migrate -m "Adding column x."
flask db upgrade
  

Flask-Миграция

То, что вы ищете, называется миграцией базы данных. Использование чего-то вроде Flask-Migrate позволяет изменять схему базы данных — добавлять или удалять столбцы — без потери ваших данных. Он также обновляет эти миграции базы данных, чтобы вы могли вернуться назад при необходимости.

Flask-Migrate использует модуль Alembic, поэтому они оба имеют одинаковую функциональность, Flask-Migrate используется для правильной настройки alembic в вашем приложении Flask и SQL-Alchemy.

Если ваше приложение находится в стадии подготовки:

Вот отличное видео от Pretty Printed о настройке Flask-Migrate. Обратите внимание, что Flask-Migrate предназначен для приложений Flask, которые используют SQL-Alchemy в качестве ORM.

Если ваше приложение находится на стадии постпродакшена:

У вас есть два варианта.

  1. Если вы хотите отслеживать только будущие миграции базы данных (более простой вариант)

Запустите flask db init , чтобы создать репозиторий миграции. Добавьте новый столбец в свою модель базы данных.

Запустите flask db migrate , чтобы сгенерировать миграцию. Сценарий миграции будет содержать только новый столбец.

Запустите flask db upgrade , чтобы применить новую миграцию к вашей базе данных.

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

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

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

Начните с flask db init , чтобы создать репозиторий миграции. Далее вам нужно обмануть Flask-Migrate, заставив думать, что ваша база данных пуста. Вы можете сделать это, переименовав вашу фактическую базу данных и создав новую базу данных с тем же именем, в которой нет таблиц.

В этом состоянии запустите flask db migrate . Это сгенерирует миграцию, которая содержит всю схему вашей базы данных. После завершения первоначальной миграции восстановите свою базу данных в правильное состояние.

Запустите flask db stamp head , чтобы пометить базу данных как обновленную. Добавьте новый столбец в свою модель базы данных.

Запустите flask db migrate еще раз, чтобы сгенерировать вторую миграцию. Сценарий миграции будет содержать только новый столбец.

Запустите flask db upgrade , чтобы применить новую миграцию к вашей базе данных.

Комментарии:

1. Привет, эрудит, прежде чем я увидел ваш ответ, я попытался добавить новый столбец в класс определения таблицы, и в функции инициализации я написал код, чтобы проверить, существует ли поле в базе данных. Если он не существует, он добавляет поле в таблицу в базе данных со значением по умолчанию, чтобы убедиться, что класс определения таблицы соответствует базе данных. Это работает нормально. Теперь мне интересно, почему миграция была бы лучшим вариантом в этом случае. Я понимаю, что выполнение работы и выполнение вещей надлежащим образом — это две разные вещи. Я действительно хочу учиться. Спасибо за вашу помощь.

2. На мой взгляд, миграции базы данных очень важны по нескольким причинам. Во-первых, они стандартизируют изменения в базах данных (т. Е. в вашей базе данных разработки, вашей производственной базе данных и т.д.), Что снижает риск ошибок. Во-вторых, он обеспечивает управление версиями вашей базы данных, чтобы вы могли вернуться назад, если вы допускаете ошибки (что мы все делаем). И, наконец, это можно автоматизировать, чтобы вам было проще обновлять в следующий раз.

Ответ №2:

Вы можете просто добавить столбец в свою модель, а затем выполнить следующие команды.

 flask db migrate -m "Your Message."
  

Затем запустите:

 flask db upgrade
  

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