миграции создаются неоднократно - PullRequest
0 голосов
/ 12 декабря 2018

Я создал несколько моделей, и когда я запускаю команду python manage.py db migrate, она создает файл миграции, и это нормально. Команда
python manage.py db upgrade также создает таблицу в базе данных.
Если я снова запускаю python manage.py db migrateЗатем команда создает файл миграции для тех моделей, которые я недавно обновил.
Не могли бы вы помочь мне решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

У меня была такая же проблема, и я решил ее.

В моем случае, есть проблема с получением текущих имен таблиц.(при вызове функции get_table_names в _autogen_for_tables ((alembic / autogenerate / compare.py))

я использую sqlalchemy с mysql-соединителем. mysql-соединитель возвращает информацию таблицы в виде байтового массива. поэтому я временно изменилследующие (base.py (sqlalchemy / dialects / mysql))

@reflection.cache
def get_table_names(self, connection, schema=None, **kw):
    """Return a Unicode SHOW TABLES from a given schema."""
    if schema is not None:
        current_schema = schema
    else:
        current_schema = self.default_schema_name

    charset = self._connection_charset
    if self.server_version_info < (5, 0, 2):
        rp = connection.execute(
            "SHOW TABLES FROM %s"
            % self.identifier_preparer.quote_identifier(current_schema)
        )
        return [
            row[0] for row in self._compat_fetchall(rp, charset=charset)
        ]
    else:
        rp = connection.execute(
            "SHOW FULL TABLES FROM %s"
            % self.identifier_preparer.quote_identifier(current_schema)
        )

        return [
            row[0]
            for row in self._compat_fetchall(rp, charset=charset)
            if row[1]  == "BASE TABLE"
        ]

до

@reflection.cache
def get_table_names(self, connection, schema=None, **kw):
    """Return a Unicode SHOW TABLES from a given schema."""
    if schema is not None:
        current_schema = schema
    else:
        current_schema = self.default_schema_name

    charset = self._connection_charset
    if self.server_version_info < (5, 0, 2):
        rp = connection.execute(
            "SHOW TABLES FROM %s"
            % self.identifier_preparer.quote_identifier(current_schema)
        )
        return [
            row[0] for row in self._compat_fetchall(rp, charset=charset)
        ]
    else:
        rp = connection.execute(
            "SHOW FULL TABLES FROM %s"
            % self.identifier_preparer.quote_identifier(current_schema)
        )

        return [
            row[0].decode("utf-8")
            for row in self._compat_fetchall(rp, charset=charset)
            if row[1].decode("utf-8")  == "BASE TABLE"
        ]
0 голосов
/ 12 декабря 2018

Я думаю, что проблема в управлении.Если вы сделали это так, как описано на сайте флеш-миграции, и сохранили все свои модели в этом файле, - колба-миграция просто получит эти модели, сгенерирует миграцию и сделает это всегда.Вы включили стандартную команду в свой файл, и в этом проблема.

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

Но будьте осторожны, перенос с помощью колб не делаетувидеть все изменения.С сайта:

Скрипт миграции необходимо пересмотреть и отредактировать, поскольку Alembic в настоящее время не обнаруживает каждое изменение, которое вы вносите в свои модели.В частности, Alembic в настоящее время не может обнаружить изменения имени таблицы, изменения имени столбца или ограничения с анонимным именем.Подробное описание ограничений можно найти в документации по генерации Alembic.

...