#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.
Если ваше приложение находится на стадии постпродакшена:
У вас есть два варианта.
- Если вы хотите отслеживать только будущие миграции базы данных (более простой вариант)
Запустите flask db init
, чтобы создать репозиторий миграции. Добавьте новый столбец в свою модель базы данных.
Запустите flask db migrate
, чтобы сгенерировать миграцию. Сценарий миграции будет содержать только новый столбец.
Запустите flask db upgrade
, чтобы применить новую миграцию к вашей базе данных.
На этом этапе в вашей базе данных должен появиться новый столбец, и вы можете продолжить работу. Повторяйте вышеуказанные шаги каждый раз, когда вам нужно внести дополнительные изменения.
Обратите внимание, что при таком подходе вы не сможете воссоздать всю базу данных с нуля. У вас должен быть способ инициализировать базу данных в соответствии со схемой, которая у вас была в день 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
Теперь проверьте свою базу данных.
Кроме того, вы можете взять ссылку отсюда